93 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -std=c++1z -verify %s
 | 
						|
// RUN: %clang_cc1 -std=c++17 -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, "");
 | 
						|
}
 |