xref: /aosp_15_r20/external/clang/test/CodeGenCXX/debug-info-scope.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -debug-info-kind=limited -std=c++11 -emit-llvm %s -o -| FileCheck %s
2*67e74705SXin Li //
3*67e74705SXin Li // Two variables with the same name in subsequent if staments need to be in separate scopes.
4*67e74705SXin Li //
5*67e74705SXin Li // rdar://problem/14024005
6*67e74705SXin Li 
7*67e74705SXin Li int src();
8*67e74705SXin Li 
9*67e74705SXin Li void f();
10*67e74705SXin Li 
func()11*67e74705SXin Li void func() {
12*67e74705SXin Li   // CHECK: = !DILocalVariable(name: "i"
13*67e74705SXin Li   // CHECK-SAME:               scope: [[IF1:![0-9]*]]
14*67e74705SXin Li   // CHECK-SAME:               line: [[@LINE+2]]
15*67e74705SXin Li   // CHECK: [[IF1]] = distinct !DILexicalBlock({{.*}}line: [[@LINE+1]])
16*67e74705SXin Li   if (int i = src())
17*67e74705SXin Li     f();
18*67e74705SXin Li 
19*67e74705SXin Li   // CHECK: = !DILocalVariable(name: "i"
20*67e74705SXin Li   // CHECK-SAME:               scope: [[IF2:![0-9]*]]
21*67e74705SXin Li   // CHECK-SAME:               line: [[@LINE+2]]
22*67e74705SXin Li   // CHECK: [[IF2]] = distinct !DILexicalBlock({{.*}}line: [[@LINE+1]])
23*67e74705SXin Li   if (int i = src()) {
24*67e74705SXin Li     f();
25*67e74705SXin Li   } else
26*67e74705SXin Li     f();
27*67e74705SXin Li 
28*67e74705SXin Li   // CHECK: = !DILocalVariable(name: "i"
29*67e74705SXin Li   // CHECK-SAME:               scope: [[FOR:![0-9]*]]
30*67e74705SXin Li   // CHECK-SAME:               line: [[@LINE+2]]
31*67e74705SXin Li   // CHECK: [[FOR]] = distinct !DILexicalBlock({{.*}}line: [[@LINE+1]])
32*67e74705SXin Li   for (int i = 0;
33*67e74705SXin Li   // CHECK: = !DILocalVariable(name: "b"
34*67e74705SXin Li   // CHECK-SAME:               scope: [[FOR_BODY:![0-9]*]]
35*67e74705SXin Li   // CHECK-SAME:               line: [[@LINE+6]]
36*67e74705SXin Li   // CHECK: [[FOR_BODY]] = distinct !DILexicalBlock({{.*}}line: [[@LINE-4]])
37*67e74705SXin Li   // The scope could be located at 'bool b', but LLVM drops line information for
38*67e74705SXin Li   // scopes anyway, so it's not terribly important.
39*67e74705SXin Li   // FIXME: change the debug info schema to not include locations of scopes,
40*67e74705SXin Li   // since they're not used.
41*67e74705SXin Li        bool b = i != 10; ++i)
42*67e74705SXin Li     f();
43*67e74705SXin Li 
44*67e74705SXin Li   // CHECK: = !DILocalVariable(name: "i"
45*67e74705SXin Li   // CHECK-SAME:               scope: [[FOR:![0-9]*]]
46*67e74705SXin Li   // CHECK-SAME:               line: [[@LINE+2]]
47*67e74705SXin Li   // CHECK: [[FOR]] = distinct !DILexicalBlock({{.*}}line: [[@LINE+1]])
48*67e74705SXin Li   for (int i = 0; i != 10; ++i) {
49*67e74705SXin Li     // FIXME: Do not include scopes that have only other scopes (and no variables
50*67e74705SXin Li     // or using declarations) as direct children, they just waste
51*67e74705SXin Li     // space/relocations/etc.
52*67e74705SXin Li     // CHECK: [[FOR_LOOP_INCLUDING_COND:!.*]] = distinct !DILexicalBlock(scope: [[FOR]],{{.*}} line: [[@LINE-4]])
53*67e74705SXin Li     // CHECK: = !DILocalVariable(name: "b"
54*67e74705SXin Li     // CHECK-SAME:               scope: [[FOR_COMPOUND:![0-9]*]]
55*67e74705SXin Li     // CHECK-SAME:               line: [[@LINE+2]]
56*67e74705SXin Li     // CHECK: [[FOR_COMPOUND]] = distinct !DILexicalBlock(scope: [[FOR_LOOP_INCLUDING_COND]],{{.*}} line: [[@LINE-8]])
57*67e74705SXin Li     bool b = i % 2;
58*67e74705SXin Li   }
59*67e74705SXin Li 
60*67e74705SXin Li   int x[] = {1, 2};
61*67e74705SXin Li   // CHECK: = !DILocalVariable(name: "__range"
62*67e74705SXin Li   // CHECK-SAME:               scope: [[RANGE_FOR:![0-9]*]]
63*67e74705SXin Li   // CHECK-NOT:                line:
64*67e74705SXin Li   // CHECK-SAME:               ){{$}}
65*67e74705SXin Li   // CHECK: [[RANGE_FOR]] = distinct !DILexicalBlock({{.*}}, line: [[@LINE+1]])
66*67e74705SXin Li   for (int i : x) {
67*67e74705SXin Li     // CHECK: = !DILocalVariable(name: "i"
68*67e74705SXin Li     // CHECK-SAME:               scope: [[RANGE_FOR_BODY:![0-9]*]]
69*67e74705SXin Li     // CHECK-SAME:               line: [[@LINE-3]]
70*67e74705SXin Li     // CHECK: [[RANGE_FOR_BODY]] = distinct !DILexicalBlock(scope: [[RANGE_FOR]],{{.*}} line: [[@LINE-4]])
71*67e74705SXin Li   }
72*67e74705SXin Li }
73