From: Jason Merrill Date: Tue, 24 Jan 2023 21:26:50 +0000 (-0500) Subject: c++: "" #pragma at BOF [PR108504] X-Git-Tag: basepoints/gcc-14~1872 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=327d45c57ebd2655a7599df0f01b8b5e2f82eda7;p=thirdparty%2Fgcc.git c++: "" #pragma at BOF [PR108504] Since r11-2095 we pass flags to cp_lexer_get_preprocessor_token, and cp_lexer_new_main passes C_LEX_STRING_NO_JOIN when lexing most of the translation unit, but doesn't do that for the very first token; as a result, if the first token is a string literal, we try to join strings and get confused if that encounters a pragma. PR c++/108504 gcc/cp/ChangeLog: * parser.cc (cp_lexer_new_main): Pass C_LEX_STRING_NO_JOIN for first token, too. gcc/testsuite/ChangeLog: * g++.dg/ext/pragma1.C: New test. --- diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index b38c22e9a3dc..07ec0e144912 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -705,7 +705,7 @@ cp_lexer_new_main (void) /* It's possible that parsing the first pragma will load a PCH file, which is a GC collection point. So we have to do that before allocating any memory. */ - cp_lexer_get_preprocessor_token (0, &token); + cp_lexer_get_preprocessor_token (C_LEX_STRING_NO_JOIN, &token); cp_parser_initial_pragma (&token); c_common_no_more_pch (); diff --git a/gcc/testsuite/g++.dg/ext/pragma1.C b/gcc/testsuite/g++.dg/ext/pragma1.C new file mode 100644 index 000000000000..bb258dac9a74 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pragma1.C @@ -0,0 +1,4 @@ +// PR c++/108504 + +"1" // { dg-error "" } +#pragma GCC diagnostic push