| /* Copyright (C) 2000 Free Software Foundation, Inc. */ |
| |
| /* { dg-do preprocess } */ |
| /* { dg-options "-pedantic -std=gnu99" } */ |
| |
| /* Tests macro syntax, for both definition and invocation, including:- |
| |
| o Full range of macro definition semantics. |
| o No. of arguments supplied to function-like macros. |
| o Odd GNU rest args behavior. |
| o Macro arguments do not flow into the rest of the file. */ |
| |
| |
| /* Test basic macro definition syntax. The macros are all called |
| "foo" deliberately to provoke an (excess) redefinition warning in |
| case the macros succeed in being entered in the macro hash table |
| despite being an error. |
| |
| Split a couple of the lines to check that the errors appear on the |
| right line (i.e. are associated with the correct token). */ |
| |
| #define ; /* { dg-error "identifier" } */ |
| #define SEMI; /* { dg-warning "space" } */ |
| #define foo(X /* { dg-error "missing" } */ |
| #define foo\ |
| (X,) /* { dg-error "parameter name" } */ |
| #define foo(, X) /* { dg-error "parameter name" } */ |
| #define foo(X, X) /* { dg-error "duplicate" } */ |
| #define foo(X Y) /* { dg-error "comma" } */ |
| #define foo(() /* { dg-error "may not appear" } */ |
| #define foo(..., X) /* { dg-error "missing" } */ |
| #define foo \ |
| __VA_ARGS__ /* { dg-warning "__VA_ARGS__" } */ |
| #define goo(__VA_ARGS__) /* { dg-warning "__VA_ARGS__" } */ |
| #define hoo(...) __VA_ARGS__ /* OK. */ |
| #define __VA_ARGS__ /* { dg-warning "__VA_ARGS__" } */ |
| __VA_ARGS__ /* { dg-warning "__VA_ARGS__" } */ |
| |
| /* test # of supplied arguments. */ |
| #define none() |
| #define one(x) |
| #define two(x, y) |
| #define var0(...) |
| #define var1(x, ...) |
| none() /* OK. */ |
| none(ichi) /* { dg-error "passed 1" } */ |
| one() /* OK. */ |
| one(ichi) /* OK. */ |
| one(ichi\ |
| , ni) /* { dg-error "passed 2" } */ |
| two(ichi) /* { dg-error "requires 2" } */ |
| var0() /* OK. */ |
| var0(ichi) /* OK. */ |
| var1() /* { dg-warning "rest arguments to be used" } */ |
| var1(ichi) /* { dg-warning "rest arguments to be used" } */ |
| var1(ichi, ni) /* OK. */ |
| |
| /* This tests two oddities of GNU rest args - omitting a comma is OK, |
| and backtracking a token on pasting an empty rest args. */ |
| #define rest(x, y...) x ## y /* { dg-warning "ISO C" } */ |
| rest(ichi,) /* OK. */ |
| rest(ichi) /* { dg-warning "rest arguments to be used" } */ |
| #if 23 != rest(2, 3) /* OK, no warning. */ |
| #error 23 != 23 !! |
| #endif |
| |
| /* Test that we don't allow arguments to flow into the rest of the |
| file. */ |
| #define half_invocation do_nowt(2 |
| #define do_nowt(x) x |
| half_invocation ) /* OK. */ |
| do_nowt (half_invocation)) /* { dg-error "unterminated argument" } */ |