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 7 int src(); 8 9 void f(); 10 11 void 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: "__range" 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