1*a1545f51SKen Matsui // RUN: %clang_cc1 %s -Eonly -verify -Wno-all -Wno-c++2b-extensions -pedantic -std=c++20
2*a1545f51SKen Matsui // RUN: %clang_cc1 %s -Eonly -verify -Wno-all -Wno-c++2b-extensions -pedantic -std=c++11
3*a1545f51SKen Matsui // RUN: %clang_cc1 -x c %s -Eonly -verify -Wno-all -Wno-c2x-extensions -pedantic -std=c99
40436ec21SRichard Smith 
518268428SFaisal Vali //expected-error@+1{{missing '('}}
618268428SFaisal Vali #define V1(...) __VA_OPT__
718268428SFaisal Vali #undef V1
818268428SFaisal Vali // OK
918268428SFaisal Vali #define V1(...) __VA_OPT__  ()
1018268428SFaisal Vali #undef V1
1118268428SFaisal Vali 
1218268428SFaisal Vali //expected-warning@+1{{can only appear in the expansion of a variadic macro}}
1318268428SFaisal Vali #define V2() __VA_OPT__(x)
1418268428SFaisal Vali #undef V2
1518268428SFaisal Vali 
1618268428SFaisal Vali //expected-error@+2{{missing ')' after}}
1718268428SFaisal Vali //expected-note@+1{{to match this '('}}
1818268428SFaisal Vali #define V3(...) __VA_OPT__(
1918268428SFaisal Vali #undef V3
2018268428SFaisal Vali 
2118268428SFaisal Vali #define V4(...) __VA_OPT__(__VA_ARGS__)
2218268428SFaisal Vali #undef V4
2318268428SFaisal Vali 
2418268428SFaisal Vali //expected-error@+1{{nested}}
2518268428SFaisal Vali #define V5(...) __VA_OPT__(__VA_OPT__())
2618268428SFaisal Vali #undef V5
2718268428SFaisal Vali 
2818268428SFaisal Vali //expected-error@+1{{not followed by}}
2918268428SFaisal Vali #define V1(...) __VA_OPT__  (#)
3018268428SFaisal Vali #undef V1
3118268428SFaisal Vali 
3218268428SFaisal Vali //expected-error@+1{{cannot appear at start}}
3318268428SFaisal Vali #define V1(...) __VA_OPT__  (##)
3418268428SFaisal Vali #undef V1
3518268428SFaisal Vali 
3618268428SFaisal Vali //expected-error@+1{{cannot appear at start}}
3718268428SFaisal Vali #define V1(...) __VA_OPT__  (## X) x
3818268428SFaisal Vali #undef V1
3918268428SFaisal Vali 
4018268428SFaisal Vali //expected-error@+1{{cannot appear at end}}
4118268428SFaisal Vali #define V1(...) y __VA_OPT__  (X ##)
4218268428SFaisal Vali #undef V1
4318268428SFaisal Vali 
4418268428SFaisal Vali 
4518268428SFaisal Vali #define FOO(x,...) # __VA_OPT__(x) #x #__VA_OPT__(__VA_ARGS__) //OK
4618268428SFaisal Vali 
4718268428SFaisal Vali //expected-error@+1{{not followed by a macro parameter}}
4818268428SFaisal Vali #define V1(...) __VA_OPT__(#)
4918268428SFaisal Vali #undef V1
5018268428SFaisal Vali 
5118268428SFaisal Vali //expected-error@+1{{cannot appear at start}}
5218268428SFaisal Vali #define V1(...) a __VA_OPT__(##) b
5318268428SFaisal Vali #undef V1
5418268428SFaisal Vali 
5518268428SFaisal Vali //expected-error@+1{{cannot appear at start}}
5618268428SFaisal Vali #define V1(...) a __VA_OPT__(a ## b) b __VA_OPT__(##)
5718268428SFaisal Vali #undef V1
5818268428SFaisal Vali 
5918268428SFaisal Vali #define V1(x,...) # __VA_OPT__(b x) // OK
6018268428SFaisal Vali #undef V1
6118268428SFaisal Vali 
6218268428SFaisal Vali //expected-error@+2{{missing ')' after}}
6318268428SFaisal Vali //expected-note@+1{{to match this '('}}
6418268428SFaisal Vali #define V1(...) __VA_OPT__  ((())
6518268428SFaisal Vali #undef V1
6618268428SFaisal Vali 
670436ec21SRichard Smith // __VA_OPT__ can't appear anywhere else.
680436ec21SRichard Smith #if __VA_OPT__ // expected-warning {{__VA_OPT__ can only appear in the expansion of a variadic macro}}
690436ec21SRichard Smith #endif
700436ec21SRichard Smith 
718edd3464SAaron Ballman // expected-warning@+2 {{__VA_OPT__ can only appear in the expansion of a variadic macro}}
725dfa37a7SRichard Smith #ifdef __VA_OPT__ // expected-warning {{__VA_OPT__ can only appear in the expansion of a variadic macro}}
738edd3464SAaron Ballman #elifdef __VA_OPT__
740436ec21SRichard Smith #endif
755dfa37a7SRichard Smith 
765dfa37a7SRichard Smith #define BAD __VA_OPT__ // expected-warning {{__VA_OPT__ can only appear in the expansion of a variadic macro}}
77