| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,70 @@ | ||
| // RUN: %clang_cc1 -std=c++1z -triple x86_64-apple-macosx10.7.0 -emit-llvm -o - %s -w | FileCheck %s | ||
|
|
||
| typedef int T; | ||
| void f() { | ||
| // CHECK: %[[A:.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: store i32 5, i32* %[[A]], align 4 | ||
| // CHECK-NEXT: %[[B:.*]] = load i32, i32* %[[A]], align 4 | ||
| // CHECK-NEXT %[[C:.*]] = icmp slt i32 %[[B]], 8 | ||
| if (int a = 5; a < 8) | ||
| ; | ||
| } | ||
|
|
||
| void f1() { | ||
| // CHECK: %[[A:.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: %[[B:.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: %[[C:.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: store i32 5, i32* %[[B]], align 4 | ||
| // CHECK-NEXT: store i32 7, i32* %[[C]], align 4 | ||
| if (int a, b = 5; int c = 7) | ||
| ; | ||
| } | ||
|
|
||
| int f2() { | ||
| // CHECK: %[[A:.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: %[[B:.*]] = call i32 @_Z2f2v() | ||
| // CHECK-NEXT: store i32 7, i32* %[[A]], align 4 | ||
| // CHECK-NEXT: %[[C:.*]] = load i32, i32* %[[A]], align 4 | ||
| // CHECK-NEXT: %[[D:.*]] = icmp ne i32 %[[C]], 0 | ||
| if (T{f2()}; int c = 7) | ||
| ; | ||
| return 2; | ||
| } | ||
|
|
||
| void g() { | ||
| // CHECK: %[[A:.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: store i32 5, i32* %[[A]], align 4 | ||
| // CHECK-NEXT: %[[B:.*]] = load i32, i32* %[[A]], align 4 | ||
| // CHECK-NEXT: switch i32 %[[B]], label %[[C:.*]] [ | ||
| switch (int a = 5; a) { | ||
| case 0: | ||
| break; | ||
| } | ||
| } | ||
|
|
||
| void g1() { | ||
| // CHECK: %[[A:.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: %[[B:.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: %[[C:.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: store i32 5, i32* %[[B]], align 4 | ||
| // CHECK-NEXT: store i32 7, i32* %[[C]], align 4 | ||
| // CHECK-NEXT: %[[D:.*]] = load i32, i32* %[[C]], align 4 | ||
| // CHECK-NEXT: switch i32 %[[D]], label %[[E:.*]] [ | ||
| switch (int a, b = 5; int c = 7) { | ||
| case 0: | ||
| break; | ||
| } | ||
| } | ||
|
|
||
| int g2() { | ||
| // CHECK: %[[A:.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: %[[B:.*]] = call i32 @_Z2f2v() | ||
| // CHECK-NEXT: store i32 7, i32* %[[A]], align 4 | ||
| // CHECK-NEXT: %[[C:.*]] = load i32, i32* %[[A]], align 4 | ||
| // CHECK-NEXT: switch i32 %[[C]], label %[[E:.*]] [ | ||
| switch (T{f2()}; int c = 7) { | ||
| case 0: | ||
| break; | ||
| } | ||
| return 2; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| // Test this without pch. | ||
| // RUN: %clang_cc1 -std=c++1z -include %S/cxx1z-init-statement.h -fsyntax-only -emit-llvm -o - %s | ||
|
|
||
| // Test with pch. | ||
| // RUN: %clang_cc1 -x c++ -std=c++1z -emit-pch -o %t %S/cxx1z-init-statement.h | ||
| // RUN: %clang_cc1 -std=c++1z -include-pch %t -fsyntax-only -emit-llvm -o - %s | ||
|
|
||
| void g0(void) { | ||
| static_assert(test_if(-1) == -1, ""); | ||
| static_assert(test_if(0) == 0, ""); | ||
| } | ||
|
|
||
| void g1(void) { | ||
| static_assert(test_switch(-1) == -1, ""); | ||
| static_assert(test_switch(0) == 0, ""); | ||
| static_assert(test_switch(1) == 1, ""); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| // Header for PCH test cxx1z-init-statement.cpp | ||
|
|
||
| constexpr int test_if(int x) { | ||
| if (int a = ++x; a == 0) { | ||
| return -1; | ||
| } else if (++a; a == 2) { | ||
| return 0; | ||
| } | ||
| return 2; | ||
| } | ||
|
|
||
| constexpr int test_switch(int x) { | ||
| switch (int a = ++x; a) { | ||
| case 0: | ||
| return -1; | ||
| case 1: | ||
| return 0; | ||
| case 2: | ||
| return 1; | ||
| } | ||
| return 2; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| // RUN: %clang_cc1 -std=c++1z -verify -Wuninitialized %s | ||
|
|
||
| void testIf() { | ||
| if (bool b; b) // expected-warning {{uninitialized}} expected-note {{to silence}} | ||
| ; | ||
| if (int a, b = 2; a) // expected-warning {{uninitialized}} expected-note {{to silence}} | ||
| ; | ||
| int a; | ||
| if (a = 0; a) {} // OK | ||
| } | ||
|
|
||
| void testSwitch() { | ||
| switch (bool b; b) { // expected-warning {{uninitialized}} expected-warning {{boolean value}} expected-note {{to silence}} | ||
| case 0: | ||
| break; | ||
| } | ||
| switch (int a, b = 7; a) { // expected-warning {{uninitialized}} expected-note {{to silence}} | ||
| case 0: | ||
| break; | ||
| } | ||
| int c; | ||
| switch (c = 0; c) { // OK | ||
| case 0: | ||
| break; | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,91 @@ | ||
| // RUN: %clang_cc1 -std=c++1z -verify %s | ||
|
|
||
| void testIf() { | ||
| int x = 0; | ||
| if (x; x) ++x; | ||
| if (int t = 0; t) ++t; else --t; | ||
|
|
||
| if (int x, y = 0; y) // expected-note 2 {{previous definition is here}} | ||
| int x = 0; // expected-error {{redefinition of 'x'}} | ||
| else | ||
| int x = 0; // expected-error {{redefinition of 'x'}} | ||
|
|
||
| if (x; int a = 0) ++a; | ||
| if (x, +x; int a = 0) // expected-note 2 {{previous definition is here}} expected-warning {{unused}} | ||
| int a = 0; // expected-error {{redefinition of 'a'}} | ||
| else | ||
| int a = 0; // expected-error {{redefinition of 'a'}} | ||
|
|
||
| if (int b = 0; b) | ||
| ; | ||
| b = 2; // expected-error {{use of undeclared identifier}} | ||
| } | ||
|
|
||
| void testSwitch() { | ||
| int x = 0; | ||
| switch (x; x) { | ||
| case 1: | ||
| ++x; | ||
| } | ||
|
|
||
| switch (int x, y = 0; y) { | ||
| case 1: | ||
| ++x; | ||
| default: | ||
| ++y; | ||
| } | ||
|
|
||
| switch (int x, y = 0; y) { // expected-note 2 {{previous definition is here}} | ||
| case 0: | ||
| int x = 0; // expected-error {{redefinition of 'x'}} | ||
| case 1: | ||
| int y = 0; // expected-error {{redefinition of 'y'}} | ||
| }; | ||
|
|
||
| switch (x; int a = 0) { | ||
| case 0: | ||
| ++a; | ||
| } | ||
|
|
||
| switch (x, +x; int a = 0) { // expected-note {{previous definition is here}} expected-warning {{unused}} | ||
| case 0: | ||
| int a = 0; // expected-error {{redefinition of 'a'}} // expected-note {{previous definition is here}} | ||
| case 1: | ||
| int a = 0; // expected-error {{redefinition of 'a'}} | ||
| } | ||
|
|
||
| switch (int b = 0; b) { | ||
| case 0: | ||
| break; | ||
| } | ||
| b = 2; // expected-error {{use of undeclared identifier}} | ||
| } | ||
|
|
||
| constexpr bool constexpr_if_init(int n) { | ||
| if (int a = n; ++a > 0) | ||
| return true; | ||
| else | ||
| return false; | ||
| } | ||
|
|
||
| constexpr int constexpr_switch_init(int n) { | ||
| switch (int p = n + 2; p) { | ||
| case 0: | ||
| return 0; | ||
| case 1: | ||
| return 1; | ||
| default: | ||
| return -1; | ||
| } | ||
| } | ||
|
|
||
| void test_constexpr_init_stmt() { | ||
| constexpr bool a = constexpr_if_init(-2); | ||
| static_assert(!a, ""); | ||
| static_assert(constexpr_if_init(1), ""); | ||
|
|
||
| constexpr int b = constexpr_switch_init(-1); | ||
| static_assert(b == 1, ""); | ||
| static_assert(constexpr_switch_init(-2) == 0, ""); | ||
| static_assert(constexpr_switch_init(-5) == -1, ""); | ||
| } |