|  | // RUN: %clang_cc1 -triple=x86_64-pc-windows-msvc -debug-info-kind=limited \ | 
|  | // RUN:    -std=c++11 -gcodeview -gno-column-info -emit-llvm -o - %s \ | 
|  | // RUN:    | FileCheck -check-prefix=NONEST %s | 
|  | // RUN: %clang_cc1 -triple=x86_64-pc-windows-msvc -debug-info-kind=limited \ | 
|  | // RUN:    -std=c++11 -gcodeview -emit-llvm -o - %s \ | 
|  | // RUN:    | FileCheck -check-prefix=COLUMNS %s | 
|  | // RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -debug-info-kind=limited \ | 
|  | // RUN:    -std=c++11 -gno-column-info -emit-llvm -o - %s | FileCheck -check-prefix=NESTED %s | 
|  | // RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -debug-info-kind=limited \ | 
|  | // RUN:    -std=c++11 -emit-llvm -o - %s \ | 
|  | // RUN:    | FileCheck -check-prefix=COLUMNS %s | 
|  |  | 
|  | class Foo { | 
|  | public: | 
|  | static Foo create(); | 
|  | void func(); | 
|  | int *begin(); | 
|  | int *end(); | 
|  | }; | 
|  |  | 
|  | int bar(int x, int y); | 
|  | int baz(int x, int y); | 
|  | int qux(int x, int y); | 
|  | int onearg(int x); | 
|  | int noargs(); | 
|  | int noargs1(); | 
|  | Foo range(int x); | 
|  |  | 
|  | int foo(int x, int y, int z) { | 
|  | int a = bar(x, y) + | 
|  | baz(x, z) + | 
|  | qux(y, z); | 
|  | // NONEST: call noundef i32 @{{.*}}bar{{.*}}, !dbg ![[LOC:[0-9]+]] | 
|  | // NONEST: call noundef i32 @{{.*}}baz{{.*}}, !dbg ![[LOC]] | 
|  | // NONEST: call noundef i32 @{{.*}}qux{{.*}}, !dbg ![[LOC]] | 
|  | // NONEST: store i32 {{.*}}, ptr %a,{{.*}} !dbg ![[LOC]] | 
|  | // NESTED: call noundef i32 @{{.*}}bar{{.*}}, !dbg ![[BAR:[0-9]+]] | 
|  | // NESTED: call noundef i32 @{{.*}}baz{{.*}}, !dbg ![[BAZ:[0-9]+]] | 
|  | // NESTED: call noundef i32 @{{.*}}qux{{.*}}, !dbg ![[QUX:[0-9]+]] | 
|  | // NESTED: store i32 {{.*}}, ptr %a,{{.*}} !dbg ![[BAR]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}bar{{.*}}, !dbg ![[BAR:[0-9]+]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}baz{{.*}}, !dbg ![[BAZ:[0-9]+]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}qux{{.*}}, !dbg ![[QUX:[0-9]+]] | 
|  | // COLUMNS: store i32 {{.*}}, ptr %a,{{.*}} !dbg ![[DECLA:[0-9]+]] | 
|  |  | 
|  | int i = 1, b = 0, c = 0; | 
|  | // NONEST: store i32 1, ptr %i,{{.*}} !dbg ![[ILOC:[0-9]+]] | 
|  | // NONEST: store i32 0, ptr %b,{{.*}} !dbg ![[ILOC]] | 
|  | // NONEST: store i32 0, ptr %c,{{.*}} !dbg ![[ILOC]] | 
|  | // NESTED: store i32 1, ptr %i,{{.*}} !dbg ![[ILOC:[0-9]+]] | 
|  | // NESTED: store i32 0, ptr %b,{{.*}} !dbg ![[ILOC]] | 
|  | // NESTED: store i32 0, ptr %c,{{.*}} !dbg ![[ILOC]] | 
|  | // COLUMNS: store i32 1, ptr %i,{{.*}} !dbg ![[ILOC:[0-9]+]] | 
|  | // COLUMNS: store i32 0, ptr %b,{{.*}} !dbg ![[BLOC:[0-9]+]] | 
|  | // COLUMNS: store i32 0, ptr %c,{{.*}} !dbg ![[CLOC:[0-9]+]] | 
|  |  | 
|  | while (i > 0) { | 
|  | b = bar(a, b); | 
|  | --i; | 
|  | } | 
|  | // NONEST: call noundef i32 @{{.*}}bar{{.*}}, !dbg ![[WHILE1:[0-9]+]] | 
|  | // NONEST: store i32 %{{[^,]+}}, ptr %i,{{.*}} !dbg ![[WHILE2:[0-9]+]] | 
|  | // NESTED: call noundef i32 @{{.*}}bar{{.*}}, !dbg ![[WHILE1:[0-9]+]] | 
|  | // NESTED: store i32 %{{[^,]+}}, ptr %i,{{.*}} !dbg ![[WHILE2:[0-9]+]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}bar{{.*}}, !dbg ![[WHILE1:[0-9]+]] | 
|  | // COLUMNS: store i32 %{{[^,]+}}, ptr %i,{{.*}} !dbg ![[WHILE2:[0-9]+]] | 
|  |  | 
|  | for (i = 0; i < 1; i++) { | 
|  | b = bar(a, b); | 
|  | c = qux(a, c); | 
|  | } | 
|  | // NONEST: call noundef i32 @{{.*}}bar{{.*}}, !dbg ![[FOR1:[0-9]+]] | 
|  | // NONEST: call noundef i32 @{{.*}}qux{{.*}}, !dbg ![[FOR2:[0-9]+]] | 
|  | // NESTED: call noundef i32 @{{.*}}bar{{.*}}, !dbg ![[FOR1:[0-9]+]] | 
|  | // NESTED: call noundef i32 @{{.*}}qux{{.*}}, !dbg ![[FOR2:[0-9]+]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}bar{{.*}}, !dbg ![[FOR1:[0-9]+]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}qux{{.*}}, !dbg ![[FOR2:[0-9]+]] | 
|  |  | 
|  | if (a < b) { | 
|  | int t = a; | 
|  | a = b; | 
|  | b = t; | 
|  | } | 
|  | // NONEST: store i32 %{{[^,]+}}, ptr %t,{{.*}} !dbg ![[IF1:[0-9]+]] | 
|  | // NONEST: store i32 %{{[^,]+}}, ptr %a,{{.*}} !dbg ![[IF2:[0-9]+]] | 
|  | // NONEST: store i32 %{{[^,]+}}, ptr %b,{{.*}} !dbg ![[IF3:[0-9]+]] | 
|  | // NESTED: store i32 %{{[^,]+}}, ptr %t,{{.*}} !dbg ![[IF1:[0-9]+]] | 
|  | // NESTED: store i32 %{{[^,]+}}, ptr %a,{{.*}} !dbg ![[IF2:[0-9]+]] | 
|  | // NESTED: store i32 %{{[^,]+}}, ptr %b,{{.*}} !dbg ![[IF3:[0-9]+]] | 
|  | // COLUMNS: store i32 %{{[^,]+}}, ptr %t,{{.*}} !dbg ![[IF1:[0-9]+]] | 
|  | // COLUMNS: store i32 %{{[^,]+}}, ptr %a,{{.*}} !dbg ![[IF2:[0-9]+]] | 
|  | // COLUMNS: store i32 %{{[^,]+}}, ptr %b,{{.*}} !dbg ![[IF3:[0-9]+]] | 
|  |  | 
|  | int d = onearg( | 
|  | noargs()); | 
|  | // NONEST: call noundef i32 @{{.*}}noargs{{.*}}, !dbg ![[DECLD:[0-9]+]] | 
|  | // NONEST: call noundef i32 @{{.*}}onearg{{.*}}, !dbg ![[DECLD]] | 
|  | // NONEST: store i32 %{{[^,]+}}, ptr %d,{{.*}} !dbg ![[DECLD]] | 
|  | // NESTED: call noundef i32 @{{.*}}noargs{{.*}}, !dbg ![[DNOARGS:[0-9]+]] | 
|  | // NESTED: call noundef i32 @{{.*}}onearg{{.*}}, !dbg ![[DECLD:[0-9]+]] | 
|  | // NESTED: store i32 %{{[^,]+}}, ptr %d,{{.*}} !dbg ![[DECLD]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}noargs{{.*}}, !dbg ![[DNOARGS:[0-9]+]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}onearg{{.*}}, !dbg ![[DONEARG:[0-9]+]] | 
|  | // COLUMNS: store i32 %{{[^,]+}}, ptr %d,{{.*}} !dbg ![[DECLD:[0-9]+]] | 
|  |  | 
|  | d = onearg(noargs()); | 
|  | // NONEST: call noundef i32 @{{.*}}noargs{{.*}}, !dbg ![[SETD:[0-9]+]] | 
|  | // NONEST: call noundef i32 @{{.*}}onearg{{.*}}, !dbg ![[SETD]] | 
|  | // NONEST: store i32 %{{[^,]+}}, ptr %d,{{.*}} !dbg ![[SETD]] | 
|  | // NESTED: call noundef i32 @{{.*}}noargs{{.*}}, !dbg ![[SETD:[0-9]+]] | 
|  | // NESTED: call noundef i32 @{{.*}}onearg{{.*}}, !dbg ![[SETD]] | 
|  | // NESTED: store i32 %{{[^,]+}}, ptr %d,{{.*}} !dbg ![[SETD]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}noargs{{.*}}, !dbg ![[SETDNOARGS:[0-9]+]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}onearg{{.*}}, !dbg ![[SETDONEARG:[0-9]+]] | 
|  | // COLUMNS: store i32 %{{[^,]+}}, ptr %d,{{.*}} !dbg ![[SETD:[0-9]+]] | 
|  |  | 
|  | for (const auto x : range(noargs())) noargs1(); | 
|  | // NONEST: call noundef i32 @{{.*}}noargs{{.*}}, !dbg ![[RANGEFOR:[0-9]+]] | 
|  | // NONEST: call {{.+}} @{{.*}}range{{.*}}, !dbg ![[RANGEFOR]] | 
|  | // NONEST: call noundef i32 @{{.*}}noargs1{{.*}}, !dbg ![[RANGEFOR_BODY:[0-9]+]] | 
|  | // NESTED: call noundef i32 @{{.*}}noargs{{.*}}, !dbg ![[RANGEFOR:[0-9]+]] | 
|  | // NESTED: call {{.+}} @{{.*}}range{{.*}}, !dbg ![[RANGEFOR]] | 
|  | // NESTED: call noundef i32 @{{.*}}noargs1{{.*}}, !dbg ![[RANGEFOR_BODY:[0-9]+]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}noargs{{.*}}, !dbg ![[RANGEFOR_NOARGS:[0-9]+]] | 
|  | // COLUMNS: call {{.+}} @{{.*}}range{{.*}}, !dbg ![[RANGEFOR_RANGE:[0-9]+]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}noargs1{{.*}}, !dbg ![[RANGEFOR_BODY:[0-9]+]] | 
|  |  | 
|  | if (noargs() && noargs1()) { | 
|  | Foo::create().func(); | 
|  | } | 
|  | // NONEST: call noundef i32 @{{.*}}noargs{{.*}}, !dbg ![[AND:[0-9]+]] | 
|  | // NONEST: call noundef i32 @{{.*}}noargs1{{.*}}, !dbg ![[AND]] | 
|  | // NONEST: call {{.+}} @{{.*}}create{{.*}}, !dbg ![[AND_BODY:[0-9]+]] | 
|  | // NONEST: call void @{{.*}}func{{.*}}, !dbg ![[AND_BODY]] | 
|  | // NESTED: call noundef i32 @{{.*}}noargs{{.*}}, !dbg ![[AND:[0-9]+]] | 
|  | // NESTED: call noundef i32 @{{.*}}noargs1{{.*}}, !dbg ![[AND]] | 
|  | // NESTED: call {{.+}} @{{.*}}create{{.*}}, !dbg ![[AND_BODY:[0-9]+]] | 
|  | // NESTED: call void @{{.*}}func{{.*}}, !dbg ![[AND_BODY]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}noargs{{.*}}, !dbg ![[ANDLHS:[0-9]+]] | 
|  | // COLUMNS: call noundef i32 @{{.*}}noargs1{{.*}}, !dbg ![[ANDRHS:[0-9]+]] | 
|  | // COLUMNS: call {{.+}} @{{.*}}create{{.*}}, !dbg ![[AND_CREATE:[0-9]+]] | 
|  | // COLUMNS: call void @{{.*}}func{{.*}}, !dbg ![[AND_FUNC:[0-9]+]] | 
|  |  | 
|  | return a - | 
|  | (b * z); | 
|  | // NONEST: mul nsw i32 {{.*}}, !dbg ![[RETLOC:[0-9]+]] | 
|  | // NONEST: sub nsw i32 {{.*}}, !dbg ![[RETLOC]] | 
|  | // NONEST: ret i32 {{.*}}, !dbg ![[RETLOC]] | 
|  | // NESTED: mul nsw i32 {{.*}}, !dbg ![[RETMUL:[0-9]+]] | 
|  | // NESTED: sub nsw i32 {{.*}}, !dbg ![[RETSUB:[0-9]+]] | 
|  | // NESTED: ret i32 {{.*}}, !dbg ! | 
|  | // COLUMNS: mul nsw i32 {{.*}}, !dbg ![[RETMUL:[0-9]+]] | 
|  | // COLUMNS: sub nsw i32 {{.*}}, !dbg ![[RETSUB:[0-9]+]] | 
|  | // COLUMNS: ret i32 {{.*}}, !dbg ! | 
|  | } | 
|  |  | 
|  | // NONEST: ![[WHILE1]] = !DILocation( | 
|  | // NONEST: ![[WHILE2]] = !DILocation( | 
|  | // NONEST: ![[FOR1]] = !DILocation( | 
|  | // NONEST: ![[FOR2]] = !DILocation( | 
|  | // NONEST: ![[IF1]] = !DILocation( | 
|  | // NONEST: ![[IF2]] = !DILocation( | 
|  | // NONEST: ![[IF3]] = !DILocation( | 
|  | // NONEST: ![[RANGEFOR]] = !DILocation( | 
|  | // NONEST-SAME: line: [[RANGEFOR_LINE:[0-9]+]] | 
|  | // NONEST: ![[RANGEFOR_BODY]] = !DILocation( | 
|  | // NONEST-SAME: line: [[RANGEFOR_LINE]] | 
|  |  | 
|  | // NESTED: ![[BAR]] = !DILocation( | 
|  | // NESTED: ![[BAZ]] = !DILocation( | 
|  | // NESTED: ![[QUX]] = !DILocation( | 
|  | // NESTED: ![[DECLD]] = !DILocation | 
|  | // NESTED: ![[DNOARGS]] = !DILocation | 
|  | // NESTED: ![[RANGEFOR]] = !DILocation( | 
|  | // NESTED-SAME: line: [[RANGEFOR_LINE:[0-9]+]] | 
|  | // NESTED: ![[RANGEFOR_BODY]] = !DILocation( | 
|  | // NESTED-SAME: line: [[RANGEFOR_LINE]] | 
|  | // NESTED: ![[RETSUB]] = !DILocation( | 
|  | // NESTED: ![[RETMUL]] = !DILocation( | 
|  |  | 
|  | // COLUMNS: ![[DECLA]] = !DILocation( | 
|  | // COLUMNS: ![[BAR]] = !DILocation( | 
|  | // COLUMNS: ![[BAZ]] = !DILocation( | 
|  | // COLUMNS: ![[QUX]] = !DILocation( | 
|  | // COLUMNS: ![[ILOC]] = !DILocation( | 
|  | // COLUMNS: ![[BLOC]] = !DILocation( | 
|  | // COLUMNS: ![[CLOC]] = !DILocation( | 
|  | // COLUMNS: ![[DECLD]] = !DILocation( | 
|  | // COLUMNS: ![[DNOARGS]] = !DILocation( | 
|  | // COLUMNS: ![[DONEARG]] = !DILocation( | 
|  | // COLUMNS: ![[SETDNOARGS]] = !DILocation( | 
|  | // COLUMNS: ![[SETDONEARG]] = !DILocation( | 
|  | // COLUMNS: ![[SETD]] = !DILocation( | 
|  | // COLUMNS: ![[RANGEFOR_NOARGS]] = !DILocation( | 
|  | // COLUMNS: ![[RANGEFOR_RANGE]] = !DILocation( | 
|  | // COLUMNS: ![[RANGEFOR_BODY]] = !DILocation( | 
|  | // COLUMNS: ![[ANDLHS]] = !DILocation | 
|  | // COLUMNS: ![[ANDRHS]] = !DILocation | 
|  | // COLUMNS: ![[AND_CREATE]] = !DILocation | 
|  | // COLUMNS: ![[AND_FUNC]] = !DILocation | 
|  | // COLUNMS: ![[RETSUB]] = !DILocation( | 
|  | // COLUMNS: ![[RETMUL]] = !DILocation( |