PR preprocessor/84517 allow double-underscore macros after string literals
gcc/testsuite: PR preprocessor/84517 * g++.dg/cpp0x/udlit-macros.C: Expect a warning for ""__FILE__. libcpp: PR preprocessor/84517 * lex.c (is_macro_not_literal_suffix): New function. (lex_raw_string, lex_string): Use is_macro_not_literal_suffix to decide when to issue -Wliteral-suffix warnings. From-SVN: r258069
This commit is contained in:
parent
c6db43fa35
commit
b44f8ad8b2
|
@ -1,3 +1,8 @@
|
||||||
|
2018-02-28 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
|
PR preprocessor/84517
|
||||||
|
* g++.dg/cpp0x/udlit-macros.C: Expect a warning for ""__FILE__.
|
||||||
|
|
||||||
2018-02-28 Eric Botcazou <ebotcazou@adacore.com>
|
2018-02-28 Eric Botcazou <ebotcazou@adacore.com>
|
||||||
|
|
||||||
* c-c++-common/dump-ada-spec-12.c: New test.
|
* c-c++-common/dump-ada-spec-12.c: New test.
|
||||||
|
|
|
@ -16,7 +16,7 @@ int operator""_ID(const char*, size_t) { return 0; }
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
long i64 = 123;
|
long i64 = 123;
|
||||||
char buf[100];
|
char buf[] = "xxxxxx"__FILE__; // { dg-warning "invalid suffix on literal" }
|
||||||
sprintf(buf, "%"PRId64"abc", i64); // { dg-warning "invalid suffix on literal" }
|
sprintf(buf, "%"PRId64"abc", i64); // { dg-warning "invalid suffix on literal" }
|
||||||
return strcmp(buf, "123abc")
|
return strcmp(buf, "123abc")
|
||||||
+ ""_zero
|
+ ""_zero
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
2018-02-28 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
|
PR preprocessor/84517
|
||||||
|
* lex.c (is_macro_not_literal_suffix): New function.
|
||||||
|
(lex_raw_string, lex_string): Use is_macro_not_literal_suffix to
|
||||||
|
decide when to issue -Wliteral-suffix warnings.
|
||||||
|
|
||||||
2018-02-16 Richard Biener <rguenther@suse.de>
|
2018-02-16 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
PR bootstrap/82939
|
PR bootstrap/82939
|
||||||
|
|
27
libcpp/lex.c
27
libcpp/lex.c
|
@ -1630,6 +1630,21 @@ is_macro(cpp_reader *pfile, const uchar *base)
|
||||||
return !result ? false : (result->type == NT_MACRO);
|
return !result ? false : (result->type == NT_MACRO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns true if a literal suffix does not have the expected form
|
||||||
|
and is defined as a macro. */
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_macro_not_literal_suffix(cpp_reader *pfile, const uchar *base)
|
||||||
|
{
|
||||||
|
/* User-defined literals outside of namespace std must start with a single
|
||||||
|
underscore, so assume anything of that form really is a UDL suffix.
|
||||||
|
We don't need to worry about UDLs defined inside namespace std because
|
||||||
|
their names are reserved, so cannot be used as macro names in valid
|
||||||
|
programs. */
|
||||||
|
if (base[0] == '_' && base[1] != '_')
|
||||||
|
return false;
|
||||||
|
return is_macro (pfile, base);
|
||||||
|
}
|
||||||
|
|
||||||
/* Lexes a raw string. The stored string contains the spelling, including
|
/* Lexes a raw string. The stored string contains the spelling, including
|
||||||
double quotes, delimiter string, '(' and ')', any leading
|
double quotes, delimiter string, '(' and ')', any leading
|
||||||
|
@ -1900,10 +1915,8 @@ lex_raw_string (cpp_reader *pfile, cpp_token *token, const uchar *base,
|
||||||
{
|
{
|
||||||
/* If a string format macro, say from inttypes.h, is placed touching
|
/* If a string format macro, say from inttypes.h, is placed touching
|
||||||
a string literal it could be parsed as a C++11 user-defined string
|
a string literal it could be parsed as a C++11 user-defined string
|
||||||
literal thus breaking the program.
|
literal thus breaking the program. */
|
||||||
Try to identify macros with is_macro. A warning is issued.
|
if (is_macro_not_literal_suffix (pfile, cur))
|
||||||
The macro name should not start with '_' for this warning. */
|
|
||||||
if ((*cur != '_') && is_macro (pfile, cur))
|
|
||||||
{
|
{
|
||||||
/* Raise a warning, but do not consume subsequent tokens. */
|
/* Raise a warning, but do not consume subsequent tokens. */
|
||||||
if (CPP_OPTION (pfile, warn_literal_suffix) && !pfile->state.skipping)
|
if (CPP_OPTION (pfile, warn_literal_suffix) && !pfile->state.skipping)
|
||||||
|
@ -2031,10 +2044,8 @@ lex_string (cpp_reader *pfile, cpp_token *token, const uchar *base)
|
||||||
{
|
{
|
||||||
/* If a string format macro, say from inttypes.h, is placed touching
|
/* If a string format macro, say from inttypes.h, is placed touching
|
||||||
a string literal it could be parsed as a C++11 user-defined string
|
a string literal it could be parsed as a C++11 user-defined string
|
||||||
literal thus breaking the program.
|
literal thus breaking the program. */
|
||||||
Try to identify macros with is_macro. A warning is issued.
|
if (is_macro_not_literal_suffix (pfile, cur))
|
||||||
The macro name should not start with '_' for this warning. */
|
|
||||||
if ((*cur != '_') && is_macro (pfile, cur))
|
|
||||||
{
|
{
|
||||||
/* Raise a warning, but do not consume subsequent tokens. */
|
/* Raise a warning, but do not consume subsequent tokens. */
|
||||||
if (CPP_OPTION (pfile, warn_literal_suffix) && !pfile->state.skipping)
|
if (CPP_OPTION (pfile, warn_literal_suffix) && !pfile->state.skipping)
|
||||||
|
|
Loading…
Reference in New Issue