1*67e74705SXin Li // RUN: %clang_cc1 -DSETNODEBUG=0 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=YESINFO 2*67e74705SXin Li // RUN: %clang_cc1 -DSETNODEBUG=1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=NOINFO 3*67e74705SXin Li 4*67e74705SXin Li #if SETNODEBUG 5*67e74705SXin Li #define NODEBUG __attribute__((nodebug)) 6*67e74705SXin Li #else 7*67e74705SXin Li #define NODEBUG 8*67e74705SXin Li #endif 9*67e74705SXin Li 10*67e74705SXin Li // Const global variable. Use it so it gets emitted. 11*67e74705SXin Li NODEBUG static const int const_global_int_def = 1; 12*67e74705SXin Li void func1(int); func2()13*67e74705SXin Livoid func2() { func1(const_global_int_def); } 14*67e74705SXin Li // YESINFO-DAG: !DIGlobalVariable(name: "const_global_int_def" 15*67e74705SXin Li // NOINFO-NOT: !DIGlobalVariable(name: "const_global_int_def" 16*67e74705SXin Li 17*67e74705SXin Li // Global variable with a more involved type. 18*67e74705SXin Li // If the variable has no debug info, the type should not appear either. 19*67e74705SXin Li struct S1 { 20*67e74705SXin Li int a; 21*67e74705SXin Li int b; 22*67e74705SXin Li }; 23*67e74705SXin Li NODEBUG S1 global_struct = { 2, 3 }; 24*67e74705SXin Li // YESINFO-DAG: !DICompositeType({{.*}} name: "S1" 25*67e74705SXin Li // NOINFO-NOT: !DICompositeType({{.*}} name: "S1" 26*67e74705SXin Li // YESINFO-DAG: !DIGlobalVariable(name: "global_struct" 27*67e74705SXin Li // NOINFO-NOT: !DIGlobalVariable(name: "global_struct" 28*67e74705SXin Li 29*67e74705SXin Li // Static data members. Const member needs a use. 30*67e74705SXin Li // Also the class as a whole needs a use, so that we produce debug info for 31*67e74705SXin Li // the entire class (iterating over the members, demonstrably skipping those 32*67e74705SXin Li // with 'nodebug'). 33*67e74705SXin Li struct S2 { 34*67e74705SXin Li NODEBUG static int static_member; 35*67e74705SXin Li NODEBUG static const int static_const_member = 4; 36*67e74705SXin Li }; 37*67e74705SXin Li int S2::static_member = 5; func3()38*67e74705SXin Livoid func3() { 39*67e74705SXin Li S2 junk; 40*67e74705SXin Li func1(S2::static_const_member); 41*67e74705SXin Li } 42*67e74705SXin Li // YESINFO-DAG: !DIGlobalVariable(name: "static_member" 43*67e74705SXin Li // NOINFO-NOT: !DIGlobalVariable(name: "static_member" 44*67e74705SXin Li // YESINFO-DAG: !DIDerivedType({{.*}} name: "static_const_member" 45*67e74705SXin Li // NOINFO-NOT: !DIDerivedType({{.*}} name: "static_const_member" 46*67e74705SXin Li 47*67e74705SXin Li // Function-local static and auto variables. func4()48*67e74705SXin Livoid func4() { 49*67e74705SXin Li NODEBUG static int static_local = 6; 50*67e74705SXin Li NODEBUG int normal_local = 7; 51*67e74705SXin Li } 52*67e74705SXin Li // YESINFO-DAG: !DIGlobalVariable(name: "static_local" 53*67e74705SXin Li // NOINFO-NOT: !DIGlobalVariable(name: "static_local" 54*67e74705SXin Li // YESINFO-DAG: !DILocalVariable(name: "normal_local" 55*67e74705SXin Li // NOINFO-NOT: !DILocalVariable(name: "normal_local" 56