92 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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, "");
 | |
| }
 |