Clang Project

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