diff --git a/gcc/testsuite/c-c++-common/raw-string-1.c b/gcc/testsuite/c-c++-common/raw-string-1.c index 199a3c6c83f..321b5afeaff 100644 --- a/gcc/testsuite/c-c++-common/raw-string-1.c +++ b/gcc/testsuite/c-c++-common/raw-string-1.c @@ -1,7 +1,6 @@ -// { dg-do run } +// { dg-do run { target { c || c++11 } } } // { dg-require-effective-target wchar } // { dg-options "-std=gnu99 -Wno-c++-compat -trigraphs" { target c } } -// { dg-options "-std=c++0x" { target c++ } } #ifndef __cplusplus #include diff --git a/gcc/testsuite/c-c++-common/raw-string-11.c b/gcc/testsuite/c-c++-common/raw-string-11.c index 19210c57452..daa75f316ab 100644 --- a/gcc/testsuite/c-c++-common/raw-string-11.c +++ b/gcc/testsuite/c-c++-common/raw-string-11.c @@ -1,7 +1,7 @@ // PR preprocessor/48740 +// { dg-do run { target { c || c++11 } } } // { dg-options "-std=gnu99 -trigraphs -save-temps" { target c } } -// { dg-options "-std=c++0x -save-temps" { target c++ } } -// { dg-do run } +// { dg-options "-save-temps" { target c++ } } int main () { @@ -9,4 +9,3 @@ int main () "foo%sbar%sfred%sbob?""?""?""?""?", sizeof ("foo%sbar%sfred%sbob?""?""?""?""?")); } - diff --git a/gcc/testsuite/c-c++-common/raw-string-13.c b/gcc/testsuite/c-c++-common/raw-string-13.c index fa11edaa7aa..5ab9a453955 100644 --- a/gcc/testsuite/c-c++-common/raw-string-13.c +++ b/gcc/testsuite/c-c++-common/raw-string-13.c @@ -1,8 +1,7 @@ // PR preprocessor/57620 -// { dg-do run } +// { dg-do run { target { c || c++11 } } } // { dg-require-effective-target wchar } // { dg-options "-std=gnu99 -Wno-c++-compat -trigraphs" { target c } } -// { dg-options "-std=c++11" { target c++ } } #ifndef __cplusplus #include diff --git a/gcc/testsuite/c-c++-common/raw-string-14.c b/gcc/testsuite/c-c++-common/raw-string-14.c index fba826c4c51..81f0fe9e1a5 100644 --- a/gcc/testsuite/c-c++-common/raw-string-14.c +++ b/gcc/testsuite/c-c++-common/raw-string-14.c @@ -1,7 +1,6 @@ // PR preprocessor/57620 -// { dg-do compile } +// { dg-do compile { target { c || c++11 } } } // { dg-options "-std=gnu99 -trigraphs" { target c } } -// { dg-options "-std=c++11" { target c++ } } const void *s0 = R"abc\ def()abcdef" 0; diff --git a/gcc/testsuite/c-c++-common/raw-string-15.c b/gcc/testsuite/c-c++-common/raw-string-15.c index 1d101dc8393..cc9d393d07d 100644 --- a/gcc/testsuite/c-c++-common/raw-string-15.c +++ b/gcc/testsuite/c-c++-common/raw-string-15.c @@ -1,8 +1,8 @@ // PR preprocessor/57620 -// { dg-do run } +// { dg-do run { target { c || c++11 } } } // { dg-require-effective-target wchar } // { dg-options "-std=gnu99 -Wno-c++-compat -Wtrigraphs" { target c } } -// { dg-options "-std=gnu++11 -Wtrigraphs" { target c++ } } +// { dg-options "-Wtrigraphs" { target c++ } } #ifndef __cplusplus #include diff --git a/gcc/testsuite/c-c++-common/raw-string-16.c b/gcc/testsuite/c-c++-common/raw-string-16.c index 1bf16dd5a1e..3ddbd8fb2ed 100644 --- a/gcc/testsuite/c-c++-common/raw-string-16.c +++ b/gcc/testsuite/c-c++-common/raw-string-16.c @@ -1,7 +1,7 @@ // PR preprocessor/57620 -// { dg-do compile } +// { dg-do compile { target { c || c++11 } } } // { dg-options "-std=gnu99 -Wtrigraphs" { target c } } -// { dg-options "-std=gnu++11 -Wtrigraphs" { target c++ } } +// { dg-options "-Wtrigraphs" { target c++ } } const void *s0 = R"abc\ def()abcdef" 0; diff --git a/gcc/testsuite/c-c++-common/raw-string-17.c b/gcc/testsuite/c-c++-common/raw-string-17.c index 30df020082e..48db8ca375f 100644 --- a/gcc/testsuite/c-c++-common/raw-string-17.c +++ b/gcc/testsuite/c-c++-common/raw-string-17.c @@ -1,7 +1,6 @@ /* PR preprocessor/57824 */ -/* { dg-do run } */ +/* { dg-do run { target { c || c++11 } } } */ /* { dg-options "-std=gnu99" { target c } } */ -/* { dg-options "-std=c++11" { target c++ } } */ #define S(s) s #define T(s) s "\n" diff --git a/gcc/testsuite/c-c++-common/raw-string-18.c b/gcc/testsuite/c-c++-common/raw-string-18.c index 6709946e0c5..d96639b8074 100644 --- a/gcc/testsuite/c-c++-common/raw-string-18.c +++ b/gcc/testsuite/c-c++-common/raw-string-18.c @@ -1,7 +1,7 @@ /* PR preprocessor/57824 */ -/* { dg-do compile } */ +/* { dg-do compile { target { c || c++11 } } } */ /* { dg-options "-std=gnu99 -fdump-tree-optimized-lineno" { target c } } */ -/* { dg-options "-std=c++11 -fdump-tree-optimized-lineno" { target c++ } } */ +/* { dg-options "-fdump-tree-optimized-lineno" { target c++ } } */ const char x[] = R"( abc diff --git a/gcc/testsuite/c-c++-common/raw-string-19.c b/gcc/testsuite/c-c++-common/raw-string-19.c index 7ab9e6cbea6..88c54208499 100644 --- a/gcc/testsuite/c-c++-common/raw-string-19.c +++ b/gcc/testsuite/c-c++-common/raw-string-19.c @@ -1,7 +1,7 @@ /* PR preprocessor/57824 */ -/* { dg-do compile } */ +// { dg-do compile { target { c || c++11 } } } /* { dg-options "-std=gnu99 -fdump-tree-optimized-lineno -save-temps" { target c } } */ -/* { dg-options "-std=c++11 -fdump-tree-optimized-lineno -save-temps" { target c++ } } */ +/* { dg-options "-fdump-tree-optimized-lineno -save-temps" { target c++ } } */ const char x[] = R"( abc diff --git a/gcc/testsuite/c-c++-common/raw-string-2.c b/gcc/testsuite/c-c++-common/raw-string-2.c index 6f2e37d47ca..9601c1de94f 100644 --- a/gcc/testsuite/c-c++-common/raw-string-2.c +++ b/gcc/testsuite/c-c++-common/raw-string-2.c @@ -1,7 +1,6 @@ -// { dg-do run } +// { dg-do run { target { c || c++11 } } } // { dg-require-effective-target wchar } // { dg-options "-std=gnu99 -Wno-c++-compat -trigraphs" { target c } } -// { dg-options "-std=c++0x" { target c++ } } #ifndef __cplusplus #include diff --git a/gcc/testsuite/c-c++-common/raw-string-4.c b/gcc/testsuite/c-c++-common/raw-string-4.c index 303233bb344..4870ac4caa0 100644 --- a/gcc/testsuite/c-c++-common/raw-string-4.c +++ b/gcc/testsuite/c-c++-common/raw-string-4.c @@ -1,7 +1,6 @@ // R is not applicable for character literals. -// { dg-do compile } +// { dg-do compile { target { c || c++11 } } } // { dg-options "-std=gnu99" { target c } } -// { dg-options "-std=c++0x" { target c++ } } const int i0 = R'a'; // { dg-error "was not declared|undeclared" "undeclared" } // { dg-error "expected ',' or ';'" "expected" { target c } .-1 } diff --git a/gcc/testsuite/c-c++-common/raw-string-5.c b/gcc/testsuite/c-c++-common/raw-string-5.c index dbf31333213..1bb4a3072e8 100644 --- a/gcc/testsuite/c-c++-common/raw-string-5.c +++ b/gcc/testsuite/c-c++-common/raw-string-5.c @@ -1,6 +1,5 @@ -// { dg-do compile } +// { dg-do compile { target { c || c++11 } } } // { dg-options "-std=gnu99" { target c } } -// { dg-options "-std=c++0x" { target c++ } } const void *s0 = R"0123456789abcdefg()0123456789abcdefg" 0; // { dg-error "raw string delimiter longer" "longer" { target *-*-* } .-1 } @@ -15,12 +14,18 @@ const void *s3 = R")())" 0; // { dg-error "invalid character" "invalid" { target *-*-* } .-1 } // { dg-error "stray" "stray" { target *-*-* } .-2 } const void *s4 = R"@()@" 0; - // { dg-error "invalid character" "invalid" { target *-*-* } .-1 } - // { dg-error "stray" "stray" { target *-*-* } .-2 } + // { dg-error "invalid character" "invalid" { target { c || c++23_down } } .-1 } + // { dg-error "stray" "stray" { target { c || c++23_down } } .-2 } + // { dg-error "before numeric constant" "numeric" { target c++26 } .-3 } const void *s5 = R"$()$" 0; - // { dg-error "invalid character" "invalid" { target *-*-* } .-1 } - // { dg-error "stray" "stray" { target *-*-* } .-2 } -const void *s6 = R"\u0040()\u0040" 0; + // { dg-error "invalid character" "invalid" { target { c || c++23_down } } .-1 } + // { dg-error "stray" "stray" { target { c || c++23_down } } .-2 } + // { dg-error "before numeric constant" "numeric" { target c++26 } .-3 } +const void *s6 = R"`()`" 0; + // { dg-error "invalid character" "invalid" { target { c || c++23_down } } .-1 } + // { dg-error "stray" "stray" { target { c || c++23_down } } .-2 } + // { dg-error "before numeric constant" "numeric" { target c++26 } .-3 } +const void *s7 = R"\u0040()\u0040" 0; // { dg-error "invalid character" "invalid" { target *-*-* } .-1 } // { dg-error "stray" "stray" { target *-*-* } .-2 } diff --git a/gcc/testsuite/c-c++-common/raw-string-6.c b/gcc/testsuite/c-c++-common/raw-string-6.c index 819dd44aff4..d8a5ac0e158 100644 --- a/gcc/testsuite/c-c++-common/raw-string-6.c +++ b/gcc/testsuite/c-c++-common/raw-string-6.c @@ -1,6 +1,5 @@ -// { dg-do compile } +// { dg-do compile { target { c || c++11 } } } // { dg-options "-std=gnu99" { target c } } -// { dg-options "-std=c++0x" { target c++ } } const void *s0 = R"ouch()ouCh"; // { dg-error "unterminated raw string" "unterminated" } // { dg-error "at end of input" "end" { target *-*-* } .-1 } diff --git a/gcc/testsuite/g++.dg/cpp26/raw-string1.C b/gcc/testsuite/g++.dg/cpp26/raw-string1.C new file mode 100644 index 00000000000..1040c704ec9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp26/raw-string1.C @@ -0,0 +1,4 @@ +// C++26 P2558R2 - Add @, $, and ` to the basic character set +// { dg-do compile { target c++26 } } + +const char *s0 = R"`@$$@`@`$()`@$$@`@`$"; diff --git a/gcc/testsuite/g++.dg/cpp26/raw-string2.C b/gcc/testsuite/g++.dg/cpp26/raw-string2.C new file mode 100644 index 00000000000..a756290f820 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp26/raw-string2.C @@ -0,0 +1,7 @@ +// C++26 P2558R2 - Add @, $, and ` to the basic character set +// { dg-do compile { target { ! { avr*-*-* mmix*-*-* *-*-aix* } } } } +// { dg-options "" } + +int a$b; +int a\u0024c; // { dg-error "universal character \\\\u0024 is not valid in an identifier" "" { target c++26 } } +int a\U00000024d; // { dg-error "universal character \\\\U00000024 is not valid in an identifier" "" { target c++26 } } diff --git a/libcpp/charset.cc b/libcpp/charset.cc index 54d7b9e0932..d58319a500a 100644 --- a/libcpp/charset.cc +++ b/libcpp/charset.cc @@ -1808,7 +1808,12 @@ _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr, result = 1; } else if (identifier_pos && result == 0x24 - && CPP_OPTION (pfile, dollars_in_ident)) + && CPP_OPTION (pfile, dollars_in_ident) + /* In C++26 when dollars are allowed in identifiers, + we should still reject \u0024 as $ is part of the basic + character set. */ + && !(CPP_OPTION (pfile, cplusplus) + && CPP_OPTION (pfile, lang) > CLK_CXX23)) { if (CPP_OPTION (pfile, warn_dollars) && !pfile->state.skipping) { diff --git a/libcpp/lex.cc b/libcpp/lex.cc index de752bdc9c8..16f2c23af1e 100644 --- a/libcpp/lex.cc +++ b/libcpp/lex.cc @@ -2718,7 +2718,10 @@ lex_raw_string (cpp_reader *pfile, cpp_token *token, const uchar *base) || c == '*' || c == '+' || c == '-' || c == '/' || c == '^' || c == '&' || c == '|' || c == '~' || c == '!' || c == '=' || c == ',' - || c == '"' || c == '\'')) + || c == '"' || c == '\'' + || ((c == '$' || c == '@' || c == '`') + && CPP_OPTION (pfile, cplusplus) + && CPP_OPTION (pfile, lang) > CLK_CXX23))) prefix[prefix_len++] = c; else {