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 Livoid 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