mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-21 00:21:03 +08:00
re PR c++/80955 (Macros expanded in definition of user-defined literals)
/libcpp 2017-11-06 Mukesh Kapoor <mukesh.kapoor@oracle.com> PR c++/80955 * lex.c (lex_string): When checking for a valid macro for the warning related to -Wliteral-suffix (CPP_W_LITERAL_SUFFIX), check that the macro name does not start with an underscore before calling is_macro(). /gcc/testsuite 2017-11-06 Mukesh Kapoor <mukesh.kapoor@oracle.com> PR c++/80955 * g++.dg/cpp0x/udlit-macros.C: New. From-SVN: r254443
This commit is contained in:
parent
16f681db11
commit
7d19c460ed
@ -1,3 +1,8 @@
|
||||
2017-11-06 Mukesh Kapoor <mukesh.kapoor@oracle.com>
|
||||
|
||||
PR c++/80955
|
||||
* g++.dg/cpp0x/udlit-macros.C: New.
|
||||
|
||||
2017-11-06 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/69739
|
||||
|
31
gcc/testsuite/g++.dg/cpp0x/udlit-macros.C
Normal file
31
gcc/testsuite/g++.dg/cpp0x/udlit-macros.C
Normal file
@ -0,0 +1,31 @@
|
||||
// PR c++/80955
|
||||
// { dg-do run { target c++11 } }
|
||||
|
||||
extern "C" int sprintf (char *s, const char *format, ...);
|
||||
extern "C" int strcmp (const char *s1, const char *s2);
|
||||
|
||||
#define __PRI64_PREFIX "l"
|
||||
#define PRId64 __PRI64_PREFIX "d"
|
||||
|
||||
using size_t = decltype(sizeof(0));
|
||||
#define _zero
|
||||
#define _ID _xx
|
||||
int operator""_zero(const char*, size_t) { return 0; }
|
||||
int operator""_ID(const char*, size_t) { return 0; }
|
||||
|
||||
int main()
|
||||
{
|
||||
long i64 = 123;
|
||||
char buf[100];
|
||||
sprintf(buf, "%"PRId64"abc", i64); // { dg-warning "invalid suffix on literal" }
|
||||
return strcmp(buf, "123abc")
|
||||
+ ""_zero
|
||||
+ "bob"_zero
|
||||
+ R"#(raw
|
||||
string)#"_zero
|
||||
+ "xx"_ID
|
||||
+ ""_ID
|
||||
+ R"AA(another
|
||||
raw
|
||||
string)AA"_ID;
|
||||
}
|
@ -1,3 +1,11 @@
|
||||
2017-11-06 Mukesh Kapoor <mukesh.kapoor@oracle.com>
|
||||
|
||||
PR c++/80955
|
||||
* lex.c (lex_string): When checking for a valid macro for the
|
||||
warning related to -Wliteral-suffix (CPP_W_LITERAL_SUFFIX),
|
||||
check that the macro name does not start with an underscore
|
||||
before calling is_macro().
|
||||
|
||||
2017-11-05 Tom de Vries <tom@codesourcery.com>
|
||||
|
||||
PR other/82784
|
||||
|
10
libcpp/lex.c
10
libcpp/lex.c
@ -1871,8 +1871,9 @@ lex_raw_string (cpp_reader *pfile, cpp_token *token, const uchar *base,
|
||||
/* 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
|
||||
literal thus breaking the program.
|
||||
Try to identify macros with is_macro. A warning is issued. */
|
||||
if (is_macro (pfile, cur))
|
||||
Try to identify macros with is_macro. A warning is issued.
|
||||
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. */
|
||||
if (CPP_OPTION (pfile, warn_literal_suffix) && !pfile->state.skipping)
|
||||
@ -2001,8 +2002,9 @@ lex_string (cpp_reader *pfile, cpp_token *token, const uchar *base)
|
||||
/* 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
|
||||
literal thus breaking the program.
|
||||
Try to identify macros with is_macro. A warning is issued. */
|
||||
if (is_macro (pfile, cur))
|
||||
Try to identify macros with is_macro. A warning is issued.
|
||||
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. */
|
||||
if (CPP_OPTION (pfile, warn_literal_suffix) && !pfile->state.skipping)
|
||||
|
Loading…
x
Reference in New Issue
Block a user