blob: e81eccc5168f23c72db205d3f71e6a899edb9e97 [file] [log] [blame]
Douglas Katzman3459ce22015-10-08 04:24:12 +00001// RUN: %clang_cc1 -debug-info-kind=limited -std=c++11 -emit-llvm %s -o -| FileCheck %s
Adrian Prantl0ffce6e2013-06-08 00:16:55 +00002//
3// Two variables with the same name in subsequent if staments need to be in separate scopes.
4//
5// rdar://problem/14024005
Adrian Prantl0ffce6e2013-06-08 00:16:55 +00006
David Blaikie93be0b22014-08-22 21:37:04 +00007int src();
Adrian Prantl0ffce6e2013-06-08 00:16:55 +00008
David Blaikie93be0b22014-08-22 21:37:04 +00009void f();
Adrian Prantl0ffce6e2013-06-08 00:16:55 +000010
David Blaikie93be0b22014-08-22 21:37:04 +000011void func() {
Duncan P. N. Exon Smith38a7f112015-07-31 18:59:37 +000012 // CHECK: = !DILocalVariable(name: "i"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000013 // CHECK-SAME: scope: [[IF1:![0-9]*]]
14 // CHECK-SAME: line: [[@LINE+2]]
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000015 // CHECK: [[IF1]] = distinct !DILexicalBlock({{.*}}line: [[@LINE+1]])
David Blaikie93be0b22014-08-22 21:37:04 +000016 if (int i = src())
17 f();
18
Duncan P. N. Exon Smith38a7f112015-07-31 18:59:37 +000019 // CHECK: = !DILocalVariable(name: "i"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000020 // CHECK-SAME: scope: [[IF2:![0-9]*]]
21 // CHECK-SAME: line: [[@LINE+2]]
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000022 // CHECK: [[IF2]] = distinct !DILexicalBlock({{.*}}line: [[@LINE+1]])
David Blaikie93be0b22014-08-22 21:37:04 +000023 if (int i = src()) {
24 f();
25 } else
26 f();
27
Duncan P. N. Exon Smith38a7f112015-07-31 18:59:37 +000028 // CHECK: = !DILocalVariable(name: "i"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000029 // CHECK-SAME: scope: [[FOR:![0-9]*]]
30 // CHECK-SAME: line: [[@LINE+2]]
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000031 // CHECK: [[FOR]] = distinct !DILexicalBlock({{.*}}line: [[@LINE+1]])
David Blaikie93be0b22014-08-22 21:37:04 +000032 for (int i = 0;
Duncan P. N. Exon Smith38a7f112015-07-31 18:59:37 +000033 // CHECK: = !DILocalVariable(name: "b"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000034 // CHECK-SAME: scope: [[FOR_BODY:![0-9]*]]
35 // CHECK-SAME: line: [[@LINE+6]]
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000036 // CHECK: [[FOR_BODY]] = distinct !DILexicalBlock({{.*}}line: [[@LINE-4]])
David Blaikie93be0b22014-08-22 21:37:04 +000037 // 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.
David Blaikie93be0b22014-08-22 21:37:04 +000041 bool b = i != 10; ++i)
42 f();
43
Duncan P. N. Exon Smith38a7f112015-07-31 18:59:37 +000044 // CHECK: = !DILocalVariable(name: "i"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000045 // CHECK-SAME: scope: [[FOR:![0-9]*]]
46 // CHECK-SAME: line: [[@LINE+2]]
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000047 // CHECK: [[FOR]] = distinct !DILexicalBlock({{.*}}line: [[@LINE+1]])
David Blaikie93be0b22014-08-22 21:37:04 +000048 for (int i = 0; i != 10; ++i) {
David Blaikie66e41972015-01-14 07:38:27 +000049 // 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.
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000052 // CHECK: [[FOR_LOOP_INCLUDING_COND:!.*]] = distinct !DILexicalBlock(scope: [[FOR]],{{.*}} line: [[@LINE-4]])
Duncan P. N. Exon Smith38a7f112015-07-31 18:59:37 +000053 // CHECK: = !DILocalVariable(name: "b"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000054 // CHECK-SAME: scope: [[FOR_COMPOUND:![0-9]*]]
55 // CHECK-SAME: line: [[@LINE+2]]
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000056 // CHECK: [[FOR_COMPOUND]] = distinct !DILexicalBlock(scope: [[FOR_LOOP_INCLUDING_COND]],{{.*}} line: [[@LINE-8]])
David Blaikie93be0b22014-08-22 21:37:04 +000057 bool b = i % 2;
Adrian Prantl0ffce6e2013-06-08 00:16:55 +000058 }
David Blaikieac0a5c42014-08-22 21:54:29 +000059
60 int x[] = {1, 2};
Duncan P. N. Exon Smith38a7f112015-07-31 18:59:37 +000061 // CHECK: = !DILocalVariable(name: "__range"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000062 // CHECK-SAME: scope: [[RANGE_FOR:![0-9]*]]
63 // CHECK-NOT: line:
64 // CHECK-SAME: ){{$}}
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000065 // CHECK: [[RANGE_FOR]] = distinct !DILexicalBlock({{.*}}, line: [[@LINE+1]])
David Blaikieac0a5c42014-08-22 21:54:29 +000066 for (int i : x) {
Duncan P. N. Exon Smith38a7f112015-07-31 18:59:37 +000067 // CHECK: = !DILocalVariable(name: "i"
Duncan P. N. Exon Smithf04be1f2015-03-03 17:25:55 +000068 // CHECK-SAME: scope: [[RANGE_FOR_BODY:![0-9]*]]
69 // CHECK-SAME: line: [[@LINE-3]]
Duncan P. N. Exon Smith9dd4e4e2015-04-29 16:40:08 +000070 // CHECK: [[RANGE_FOR_BODY]] = distinct !DILexicalBlock(scope: [[RANGE_FOR]],{{.*}} line: [[@LINE-4]])
David Blaikieac0a5c42014-08-22 21:54:29 +000071 }
Adrian Prantl0ffce6e2013-06-08 00:16:55 +000072}