xref: /llvm-project/clang/test/Preprocessor/macro_paste_bad.c (revision d3c3e78ac17602420ca05b1ce1ed7d20ba9c5ede)
18fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -Eonly -verify -pedantic %s
201ecf835SChris Lattner // pasting ""x"" and ""+"" does not give a valid preprocessing token
3378d72ccSChris Lattner #define XYZ  x ## +
4378d72ccSChris Lattner XYZ   // expected-error {{pasting formed 'x+', an invalid preprocessing token}}
5378d72ccSChris Lattner #define XXYZ  . ## test
6378d72ccSChris Lattner XXYZ   // expected-error {{pasting formed '.test', an invalid preprocessing token}}
701ecf835SChris Lattner 
8ab9d51cfSChris Lattner // GCC PR 20077
9ab9d51cfSChris Lattner 
10ab9d51cfSChris Lattner #define a   a ## ## // expected-error {{'##' cannot appear at end of macro expansion}}
11ab9d51cfSChris Lattner #define b() b ## ## // expected-error {{'##' cannot appear at end of macro expansion}}
12ab9d51cfSChris Lattner #define c   c ##    // expected-error {{'##' cannot appear at end of macro expansion}}
13ab9d51cfSChris Lattner #define d() d ##    // expected-error {{'##' cannot appear at end of macro expansion}}
14ab9d51cfSChris Lattner 
15ab9d51cfSChris Lattner 
16ab9d51cfSChris Lattner #define e   ## ## e // expected-error {{'##' cannot appear at start of macro expansion}}
17ab9d51cfSChris Lattner #define f() ## ## f // expected-error {{'##' cannot appear at start of macro expansion}}
18ab9d51cfSChris Lattner #define g   ## g    // expected-error {{'##' cannot appear at start of macro expansion}}
19ab9d51cfSChris Lattner #define h() ## h    // expected-error {{'##' cannot appear at start of macro expansion}}
20ab9d51cfSChris Lattner #define i   ##      // expected-error {{'##' cannot appear at start of macro expansion}}
21ab9d51cfSChris Lattner #define j() ##      // expected-error {{'##' cannot appear at start of macro expansion}}
22ab9d51cfSChris Lattner 
231c1a00cfSChris Lattner // Invalid token pasting.
241c1a00cfSChris Lattner // PR3918
251c1a00cfSChris Lattner 
261c1a00cfSChris Lattner // When pasting creates poisoned identifiers, we error.
271c1a00cfSChris Lattner #pragma GCC poison BLARG
281c1a00cfSChris Lattner BLARG  // expected-error {{attempt to use a poisoned identifier}}
291c1a00cfSChris Lattner #define XX BL ## ARG
301c1a00cfSChris Lattner XX     // expected-error {{attempt to use a poisoned identifier}}
311c1a00cfSChris Lattner 
321c1a00cfSChris Lattner #define VA __VA_ ## ARGS__
331c1a00cfSChris Lattner int VA;   // expected-warning {{__VA_ARGS__ can only appear in the expansion of a C99 variadic macro}}
341c1a00cfSChris Lattner 
3521db51abSDavid Majnemer #define LOG_ON_ERROR(x) x ## #y; // expected-error {{'#' is not followed by a macro parameter}}
3676faf1f5SDavid Majnemer LOG_ON_ERROR(0);
37*d3c3e78aSDavid Majnemer 
38*d3c3e78aSDavid Majnemer #define PR21379A(x) printf ##x // expected-note {{macro 'PR21379A' defined here}}
39*d3c3e78aSDavid Majnemer PR21379A(0 {, }) // expected-error {{too many arguments provided to function-like macro invocation}}
40*d3c3e78aSDavid Majnemer                  // expected-note@-1 {{parentheses are required around macro argument containing braced initializer list}}
41*d3c3e78aSDavid Majnemer 
42*d3c3e78aSDavid Majnemer #define PR21379B(x) printf #x // expected-note {{macro 'PR21379B' defined here}}
43*d3c3e78aSDavid Majnemer PR21379B(0 {, }) // expected-error {{too many arguments provided to function-like macro invocation}}
44*d3c3e78aSDavid Majnemer                  // expected-note@-1 {{parentheses are required around macro argument containing braced initializer list}}
45