1 // RUN: %clang_cc1 -fsyntax-only -std=c++17 -Wc++20-compat-pedantic -verify %s
2 // RUN: %clang_cc1 -fsyntax-only -std=c++20 -pedantic -verify %s
4 struct A
{ // expected-note 0+{{candidate}}
5 A() = default; // expected-note 0+{{candidate}}
9 #if __cplusplus <= 201703L
10 // expected-warning@-2 {{aggregate initialization of type 'A' with user-declared constructors is incompatible with C++20}}
12 // expected-error@-4 {{no matching constructor}}
16 struct B
: A
{ A a
; };
17 B b1
= {{}, {}}; // ok
19 #if __cplusplus <= 201703L
20 // expected-warning@-2 2{{aggregate initialization of type 'A' with user-declared constructors is incompatible with C++20}}
22 // expected-error@-4 2{{no viable conversion from 'int' to 'A'}}
25 // Essentially any use of a u8 string literal in C++<=17 is broken by C++20.
26 // Just warn on all such string literals.
27 struct string
{ string(const char*); }; // expected-note 0+{{candidate}}
28 char u8arr
[] = u8
"hello";
29 const char *u8ptr
= "wo" u8
"rld";
30 string u8str
= u8
"test" u8
"test";
31 #if __cplusplus <= 201703L
32 // expected-warning@-4 {{type of UTF-8 string literal will change}} expected-note@-4 {{remove 'u8' prefix}}
33 // expected-warning@-4 {{type of UTF-8 string literal will change}} expected-note@-4 {{remove 'u8' prefix}}
34 // expected-warning@-4 {{type of UTF-8 string literal will change}} expected-note@-4 {{remove 'u8' prefix}}
36 // expected-error@-8 {{ISO C++20 does not permit initialization of char array with UTF-8 string literal}}
37 // expected-error@-8 {{cannot initialize a variable of type 'const char *' with an lvalue of type 'const char8_t[6]'}}
38 // expected-error@-8 {{no viable conversion from 'const char8_t[9]' to 'string'}}
45 #if __cplusplus <= 201703L
46 // expected-warning@-3 {{this expression will be parsed as explicit(bool) in C++20}}
47 #if defined(__cpp_conditional_explicit)
48 #error "the feature test macro __cpp_conditional_explicit isn't correct"
51 // expected-error@-8 {{does not refer to a value}}
52 // expected-error@-9 {{expected member name or ';'}}
53 // expected-error@-10 {{expected ')'}}
54 // expected-note@-12 {{declared here}}
55 // expected-note@-12 {{to match this '('}}
56 #if !defined(__cpp_conditional_explicit) || __cpp_conditional_explicit != 201806L
57 #error "the feature test macro __cpp_conditional_explicit isn't correct"
61 auto l
= []() consteval
{};
63 #if __cplusplus <= 201703L
64 // expected-warning@-3 {{'consteval' is a keyword in C++20}}
65 // expected-error@-4 {{expected body of lambda expression}}
67 // expected-error@-5 {{expected unqualified-id}}