// RUN: %clang_cc1 -DSETNODEBUG=0 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=YESINFO // RUN: %clang_cc1 -DSETNODEBUG=1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=NOINFO #if SETNODEBUG #define NODEBUG __attribute__((nodebug)) #else #define NODEBUG #endif // Const global variable. Use it so it gets emitted. NODEBUG static const int const_global_int_def = 1; void func1(int); void func2() { func1(const_global_int_def); } // YESINFO-DAG: !DIGlobalVariable(name: "const_global_int_def" // NOINFO-NOT: !DIGlobalVariable(name: "const_global_int_def" // Global variable with a more involved type. // If the variable has no debug info, the type should not appear either. struct S1 { int a; int b; }; NODEBUG S1 global_struct = { 2, 3 }; // YESINFO-DAG: !DICompositeType({{.*}} name: "S1" // NOINFO-NOT: !DICompositeType({{.*}} name: "S1" // YESINFO-DAG: !DIGlobalVariable(name: "global_struct" // NOINFO-NOT: !DIGlobalVariable(name: "global_struct" // Static data members. Const member needs a use. // Also the class as a whole needs a use, so that we produce debug info for // the entire class (iterating over the members, demonstrably skipping those // with 'nodebug'). struct S2 { NODEBUG static int static_member; NODEBUG static const int static_const_member = 4; }; int S2::static_member = 5; void func3() { S2 junk; func1(S2::static_const_member); } // YESINFO-DAG: !DIGlobalVariable(name: "static_member" // NOINFO-NOT: !DIGlobalVariable(name: "static_member" // YESINFO-DAG: !DIDerivedType({{.*}} name: "static_const_member" // NOINFO-NOT: !DIDerivedType({{.*}} name: "static_const_member" // Function-local static and auto variables. void func4() { NODEBUG static int static_local = 6; NODEBUG int normal_local = 7; } // YESINFO-DAG: !DIGlobalVariable(name: "static_local" // NOINFO-NOT: !DIGlobalVariable(name: "static_local" // YESINFO-DAG: !DILocalVariable(name: "normal_local" // NOINFO-NOT: !DILocalVariable(name: "normal_local"