]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CXX/stmt.stmt/stmt.select/p3.cpp
Vendor import of clang trunk r338150:
[FreeBSD/FreeBSD.git] / test / CXX / stmt.stmt / stmt.select / p3.cpp
1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 // RUN: %clang_cc1 -fsyntax-only -std=c++1z -Wc++14-compat -verify %s -DCPP17
3
4 int f();
5
6 void 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
14 void 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
21 void 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
38 void 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.
56 void 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.
72 void whileInitStatement2() {
73   while (; false) {} // expected-error {{expected expression}}
74   // expected-warning@-1 {{expression result unused}}
75   // expected-error@-2 {{expected ';' after expression}}
76   // expected-error@-3 {{expected expression}}
77 }