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