aboutsummaryrefslogtreecommitdiff
path: root/clang/test/CodeGenCXX/tmp-md-nodes3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/CodeGenCXX/tmp-md-nodes3.cpp')
-rw-r--r--clang/test/CodeGenCXX/tmp-md-nodes3.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/tmp-md-nodes3.cpp b/clang/test/CodeGenCXX/tmp-md-nodes3.cpp
new file mode 100644
index 0000000..4656f64
--- /dev/null
+++ b/clang/test/CodeGenCXX/tmp-md-nodes3.cpp
@@ -0,0 +1,53 @@
+// REQUIRES: asserts, riscv-registered-target
+// Should trigger GenerateVarArgsThunk.
+// RUN: %clang_cc1 -O0 -triple riscv64-linux-gnu -debug-info-kind=limited -emit-llvm %s -o - | \
+// RUN: FileCheck %s
+
+// RUN: %clang_cc1 -O0 -triple riscv64-linux-gnu -debug-info-kind=limited -emit-obj %s -o - | \
+// RUN: llvm-dwarfdump --verify -
+
+// This test checks that clang doesn't crash when creating a varargs thunk
+// by cloning a function which DILocalVariable types are unresolved at cloning
+// time.
+// In such case, as a workaround, instead of cloning unresolved types for
+// the thunk, clang produces thunk DILocalVariables that refer to local
+// types from the original DISubprogram.
+
+typedef signed char __int8_t;
+typedef int BOOL;
+class CMsgAgent;
+
+class CFs {
+public:
+ typedef enum {} CACHE_HINT;
+ virtual BOOL ReqCacheHint( CMsgAgent* p_ma, CACHE_HINT hint, ... ) ;
+};
+
+typedef struct {} _Lldiv_t;
+
+class CBdVfs {
+public:
+ virtual ~CBdVfs( ) {}
+};
+
+class CBdVfsImpl : public CBdVfs, public CFs {
+ BOOL ReqCacheHint( CMsgAgent* p_ma, CACHE_HINT hint, ... );
+};
+
+BOOL CBdVfsImpl::ReqCacheHint( CMsgAgent* p_ma, CACHE_HINT hint, ... ) {
+ // Complete enum with no defintion. Clang allows to declare variables of
+ // such type.
+ enum class E : int;
+ E enum_var;
+ // Structure has forward declaration. DIDerivedType which is a pointer
+ // to it is unresolved during debug info generation for the function.
+ struct LocalStruct;
+ LocalStruct *struct_var;
+
+ struct GlobalStruct {};
+
+ return true;
+}
+
+// Check that thunk is emitted.
+// CHECK: define {{.*}} @_ZThn{{[48]}}_N10CBdVfsImpl12ReqCacheHintEP9CMsgAgentN3CFs10CACHE_HINTEz(