| // 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( |