Clang Project

clang_source_code/test/CXX/stmt.stmt/stmt.select/p3.cpp
1// RUN: %clang_cc1 -fsyntax-only -Wno-unused-value -verify %s
2// RUN: %clang_cc1 -fsyntax-only -Wno-unused-value -std=c++1z -Wc++14-compat -verify %s -DCPP17
3
4int f();
5
6void g() {
7  if (int x = f()) { // expected-note 2{{previous definition}}
8    int x; // expected-error{{redefinition of 'x'}}
9  } else {
10    int x; // expected-error{{redefinition of 'x'}}
11  }
12}
13
14void h() {
15  if (int x = f()) // expected-note 2{{previous definition}}
16    int x; // expected-error{{redefinition of 'x'}}
17  else
18    int x; // expected-error{{redefinition of 'x'}}
19}
20
21void ifInitStatement() {
22  int Var = 0;
23
24  if (int I = 0; true) {}
25  if (Var + Var; true) {}
26  if (; true) {}
27#ifdef CPP17
28  // expected-warning@-4 {{if initialization statements are incompatible with C++ standards before C++17}}
29  // expected-warning@-4 {{if initialization statements are incompatible with C++ standards before C++17}}
30  // expected-warning@-4 {{if initialization statements are incompatible with C++ standards before C++17}}
31#else
32  // expected-warning@-8 {{'if' initialization statements are a C++17 extension}}
33  // expected-warning@-8 {{'if' initialization statements are a C++17 extension}}
34  // expected-warning@-8 {{'if' initialization statements are a C++17 extension}}
35#endif
36}
37
38void switchInitStatement() {
39  int Var = 0;
40
41  switch (int I = 0; Var) {}
42  switch (Var + Var; Var) {}
43  switch (; Var) {}
44#ifdef CPP17
45  // expected-warning@-4 {{switch initialization statements are incompatible with C++ standards before C++17}}
46  // expected-warning@-4 {{switch initialization statements are incompatible with C++ standards before C++17}}
47  // expected-warning@-4 {{switch initialization statements are incompatible with C++ standards before C++17}}
48#else
49  // expected-warning@-8 {{'switch' initialization statements are a C++17 extension}}
50  // expected-warning@-8 {{'switch' initialization statements are a C++17 extension}}
51  // expected-warning@-8 {{'switch' initialization statements are a C++17 extension}}
52#endif
53}
54
55// TODO: Better diagnostics for while init statements.
56void whileInitStatement() {
57  while (int I = 10; I--); // expected-error {{expected ')'}}
58  // expected-note@-1 {{to match this '('}}
59  // expected-error@-2 {{use of undeclared identifier 'I'}}
60
61  int Var = 10;
62  while (Var + Var; Var--) {} // expected-error {{expected ')'}}
63  // expected-note@-1 {{to match this '('}}
64  // expected-error@-2 {{expected ';' after expression}}
65  // expected-error@-3 {{expected expression}}
66  // expected-warning@-4 {{while loop has empty body}}
67  // expected-note@-5 {{put the semicolon on a separate line to silence this warning}}
68}
69
70// TODO: This is needed because clang can't seem to diagnose invalid syntax after the
71// last loop above. It would be nice to remove this.
72void whileInitStatement2() {
73  while (; false) {} // expected-error {{expected expression}}
74  // expected-error@-1 {{expected ';' after expression}}
75  // expected-error@-2 {{expected expression}}
76}
77