As part of adding []-style attributes, C2x adds the token :: for use in scoped attribute names.
This patch adds corresponding support for that token in C to GCC. The token is supported both for C2x and for older gnu* standards (on the basis that extensions are normally supported in older gnu* versions; people will expect to be able to use [] attributes, before C2x is the default, without needing to use -std=gnu2x).
There are no cases in older C standards where the token : can be followed by a token starting with : in syntactically valid sources; the only cases the :: token could break in older standard C thus are ones involving concatenation of pp-tokens where the result does not end up as tokens (e.g., gets stringized). In GNU C extensions, the main case where :: might appear in existing sources is in asm statements, and the C parser is thus made to handle it like two consecutive : tokens, which the C++ parser already does. A limited test of various positionings of :: in asm statements is added to the testsuite (in particular, to cover the syntax error when :: means too many colons but a single : would be OK), but existing tests cover a
variety of styles there anyway.
Technically there are cases in Objective-C and OpenMP for which this also changes how previously valid code is lexed: the objc-selector-arg syntax allows multiple consecutive : tokens (although I don't think they are particularly useful there), while OpenMP syntax includes array section syntax such as [:] which, before :: was a token, could also be written as [::> (there might be other OpenMP cases potentially affected, I didn't check all the OpenMP syntax in detail). I don't think either of those cases affects the basis for supporting the :: token in all -std=gnu* modes, or that there is any obvious need to special-case handling of CPP_SCOPE tokens for those constructs the way there is for asm statements.
cpp_avoid_paste, which determines when spaces need adding between tokens in preprocessed output where there wouldn't otherwise be whitespace between them (e.g. if stringized), already inserts space between : and : unconditionally, rather than only for C++, so no change is needed there (but a C2x test is added that such space is indeed inserted).
Bootstrapped with no regressions on x86-64-pc-linux-gnu.
- c-parser.c (c_parser_asm_statement): Handle CPP_SCOPE like two CPP_COLON tokens.
- gcc.dg/asm-scope-1.c, gcc.dg/cpp/c11-scope-1.c, gcc.dg/cpp/c17-scope-1.c, gcc.dg/cpp/c2x-scope-1.c, gcc.dg/cpp/c2x-scope-2.c, gcc.dg/cpp/c90-scope-1.c, gcc.dg/cpp/c94-scope-1.c, gcc.dg/cpp/c99-scope-1.c, gcc.dg/cpp/gnu11-scope-1.c, gcc.dg/cpp/gnu17-scope-1.c, gcc.dg/cpp/gnu89-scope-1.c, gcc.dg/cpp/gnu99-scope-1.c: New tests.
- include/cpplib.h (struct cpp_options): Add member scope.
- init.c (struct lang_flags, lang_defaults): Likewise. (cpp_set_lang): Set scope member of pfile.
- lex.c (_cpp_lex_direct): Test CPP_OPTION (pfile, scope) not CPP_OPTION (pfile, cplusplus) for creating CPP_SCOPE tokens.
efb07a8a1ef Handle :: tokens in C for C2x.
gcc/c/ChangeLog | 5 ++++
gcc/c/c-parser.c | 25 +++++++++++++----
gcc/testsuite/ChangeLog | 9 ++++++
gcc/testsuite/gcc.dg/asm-scope-1.c | 27 ++++++++++++++++++
gcc/testsuite/gcc.dg/cpp/c11-scope-1.c | 8 ++++++
gcc/testsuite/gcc.dg/cpp/c17-scope-1.c | 8 ++++++
gcc/testsuite/gcc.dg/cpp/c2x-scope-1.c | 8 ++++++
gcc/testsuite/gcc.dg/cpp/c2x-scope-2.c | 11 ++++++++
gcc/testsuite/gcc.dg/cpp/c90-scope-1.c | 7 +++++
gcc/testsuite/gcc.dg/cpp/c94-scope-1.c | 8 ++++++
gcc/testsuite/gcc.dg/cpp/c99-scope-1.c | 8 ++++++
gcc/testsuite/gcc.dg/cpp/gnu11-scope-1.c | 8 ++++++
gcc/testsuite/gcc.dg/cpp/gnu17-scope-1.c | 8 ++++++
gcc/testsuite/gcc.dg/cpp/gnu89-scope-1.c | 8 ++++++
gcc/testsuite/gcc.dg/cpp/gnu99-scope-1.c | 8 ++++++
libcpp/ChangeLog | 8 ++++++
libcpp/include/cpplib.h | 3 ++
libcpp/init.c | 48 +++++++++++++++++---------------
libcpp/lex.c | 2 +-
19 files changed, 187 insertions(+), 30 deletions(-)