blob: e66588d699af265573d49e6ebc84ec1894439e8b [file] [log] [blame]
David Blaikieac0a5c42014-08-22 21:54:29 +00001// RUN: %clang_cc1 -g -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 Smithb3a66692014-12-15 19:10:08 +000012 // CHECK: = !{!"0x100\00{{.*}}", [[IF1:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [i] [line [[@LINE+2]]]
13 // CHECK: [[IF1]] = !{!"0xb\00[[@LINE+1]]\00{{.*}}", !{{.*}}} ; [ DW_TAG_lexical_block ]
David Blaikie93be0b22014-08-22 21:37:04 +000014 if (int i = src())
15 f();
16
Duncan P. N. Exon Smithb3a66692014-12-15 19:10:08 +000017 // CHECK: = !{!"0x100\00{{.*}}", [[IF2:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [i] [line [[@LINE+2]]]
18 // CHECK: [[IF2]] = !{!"0xb\00[[@LINE+1]]\00{{.*}}", !{{.*}}} ; [ DW_TAG_lexical_block ]
David Blaikie93be0b22014-08-22 21:37:04 +000019 if (int i = src()) {
20 f();
21 } else
22 f();
23
Duncan P. N. Exon Smithb3a66692014-12-15 19:10:08 +000024 // CHECK: = !{!"0x100\00{{.*}}", [[FOR:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [i] [line [[@LINE+2]]]
25 // CHECK: [[FOR]] = !{!"0xb\00[[@LINE+1]]\00{{.*}}", !{{.*}}} ; [ DW_TAG_lexical_block ]
David Blaikie93be0b22014-08-22 21:37:04 +000026 for (int i = 0;
Duncan P. N. Exon Smithb3a66692014-12-15 19:10:08 +000027 // CHECK: = !{!"0x100\00{{.*}}", [[FOR_BODY:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [b] [line [[@LINE+6]]]
David Blaikie93be0b22014-08-22 21:37:04 +000028 // The scope could be located at 'bool b', but LLVM drops line information for
29 // scopes anyway, so it's not terribly important.
30 // FIXME: change the debug info schema to not include locations of scopes,
31 // since they're not used.
Duncan P. N. Exon Smithb3a66692014-12-15 19:10:08 +000032 // CHECK: [[FOR_BODY]] = !{!"0xb\00[[@LINE-6]]\00{{.*}}", !{{.*}}} ; [ DW_TAG_lexical_block ]
David Blaikie93be0b22014-08-22 21:37:04 +000033 bool b = i != 10; ++i)
34 f();
35
Duncan P. N. Exon Smithb3a66692014-12-15 19:10:08 +000036 // CHECK: = !{!"0x100\00{{.*}}", [[FOR:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [i] [line [[@LINE+2]]]
37 // CHECK: [[FOR]] = !{!"0xb\00[[@LINE+1]]\00{{.*}}", !{{.*}}} ; [ DW_TAG_lexical_block ]
David Blaikie93be0b22014-08-22 21:37:04 +000038 for (int i = 0; i != 10; ++i) {
David Blaikie66e41972015-01-14 07:38:27 +000039 // FIXME: Do not include scopes that have only other scopes (and no variables
40 // or using declarations) as direct children, they just waste
41 // space/relocations/etc.
42 // CHECK: [[FOR_LOOP_INCLUDING_COND:!.*]] = !{!"0xb\00[[@LINE-4]]\00{{.*}}", !{{[0-9]+}}, [[FOR]]} ; [ DW_TAG_lexical_block ]
43 // CHECK: = !{!"0x100\00{{.*}}", [[FOR_COMPOUND:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [b] [line [[@LINE+2]]]
44 // CHECK: [[FOR_COMPOUND]] = !{!"0xb\00[[@LINE-6]]\00{{.*}}", !{{[0-9]+}}, [[FOR_LOOP_INCLUDING_COND]]} ; [ DW_TAG_lexical_block ]
David Blaikie93be0b22014-08-22 21:37:04 +000045 bool b = i % 2;
Adrian Prantl0ffce6e2013-06-08 00:16:55 +000046 }
David Blaikieac0a5c42014-08-22 21:54:29 +000047
48 int x[] = {1, 2};
Duncan P. N. Exon Smithb3a66692014-12-15 19:10:08 +000049 // CHECK: = !{!"0x100\00{{.*}}", [[RANGE_FOR:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [__range] [line 0]
50 // CHECK: [[RANGE_FOR]] = !{!"0xb\00[[@LINE+1]]\00{{.*}}", !{{.*}}} ; [ DW_TAG_lexical_block ]
David Blaikieac0a5c42014-08-22 21:54:29 +000051 for (int i : x) {
Duncan P. N. Exon Smithb3a66692014-12-15 19:10:08 +000052 // CHECK: = !{!"0x100\00{{.*}}", [[RANGE_FOR_BODY:![0-9]*]], {{.*}} ; [ DW_TAG_auto_variable ] [i] [line [[@LINE-1]]]
53 // CHECK: [[RANGE_FOR_BODY]] = !{!"0xb\00[[@LINE-2]]\00{{.*}}", !{{[0-9]+}}, [[RANGE_FOR]]} ; [ DW_TAG_lexical_block ]
David Blaikieac0a5c42014-08-22 21:54:29 +000054 }
Adrian Prantl0ffce6e2013-06-08 00:16:55 +000055}