annotate gcc/testsuite/gcc.dg/cpp/macsyntx2.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* Copyright (C) 2000-2017 Free Software Foundation, Inc. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 /* { dg-do preprocess } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 /* { dg-options "-pedantic -std=c99" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 /* Tests macro syntax, for both definition and invocation, including:-
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 o Full range of macro definition semantics.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 o No. of arguments supplied to function-like macros.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 o Odd GNU rest args behavior.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 o Macro arguments do not flow into the rest of the file. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 /* Test basic macro definition syntax. The macros are all called
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 "foo" deliberately to provoke an (excess) redefinition warning in
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 case the macros succeed in being entered in the macro hash table
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 despite being an error.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 Split a couple of the lines to check that the errors appear on the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 right line (i.e. are associated with the correct token). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 #define ; /* { dg-error "identifier" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 #define SEMI; /* { dg-warning "space" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 #define foo(X /* { dg-error "expected" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 #define foo\
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 (X,) /* { dg-error "parameter name" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 #define foo(, X) /* { dg-error "parameter name" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 #define foo(X, X) /* { dg-error "duplicate" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 #define foo(X Y) /* { dg-error "expected" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 #define foo(() /* { dg-error "parameter name" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 #define foo(..., X) /* { dg-error "expected" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 #define foo \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 __VA_ARGS__ /* { dg-warning "__VA_ARGS__" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 #define goo(__VA_ARGS__) /* { dg-warning "__VA_ARGS__" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 #define hoo(...) __VA_ARGS__ /* OK. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 #define __VA_ARGS__ /* { dg-warning "__VA_ARGS__" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 __VA_ARGS__ /* { dg-warning "__VA_ARGS__" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 /* test # of supplied arguments. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 #define none()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 #define one(x)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 #define two(x, y)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 #define var0(...)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 #define var1(x, ...)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 none() /* OK. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 none(ichi) /* { dg-error "passed 1" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 one() /* OK. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 one(ichi) /* OK. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 one(ichi\
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 , ni) /* { dg-error "passed 2" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 two(ichi) /* { dg-error "requires 2" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 var0() /* OK. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 var0(ichi) /* OK. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 var1() /* { dg-warning "requires at least one" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 var1(ichi) /* { dg-warning "requires at least one" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 var1(ichi, ni) /* OK. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 /* This tests two oddities of GNU rest args - omitting a comma is OK,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 and backtracking a token on pasting an empty rest args. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 #define rest(x, y...) x ## y /* { dg-warning "ISO C" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 rest(ichi,) /* OK. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 rest(ichi) /* { dg-warning "requires at least one" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 #if 23 != rest(2, 3) /* OK, no warning. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 #error 23 != 23 !!
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 #endif
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 /* Test that we don't allow arguments to flow into the rest of the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 file. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 #define half_invocation do_nowt(2
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 #define do_nowt(x) x
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 half_invocation ) /* OK. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 do_nowt (half_invocation)) /* { dg-error "unterminated argument" } */