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