re PR c++/80955 (Macros expanded in definition of user-defined literals)
authorMukesh Kapoor <mukesh.kapoor@oracle.com>
Mon, 6 Nov 2017 10:33:41 +0000 (10:33 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 6 Nov 2017 10:33:41 +0000 (10:33 +0000)
/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

gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/udlit-macros.C [new file with mode: 0644]
libcpp/ChangeLog
libcpp/lex.c

index 8232b4a4add0b4f2e67fec7e61e867e8d617120d..b56ace44321df07e1bb831e5b824e16b1259808f 100644 (file)
@@ -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
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-macros.C b/gcc/testsuite/g++.dg/cpp0x/udlit-macros.C
new file mode 100644 (file)
index 0000000..fb51828
--- /dev/null
@@ -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;
+}
index 285f4143d5f682f140e270f3290aed483c791ca5..86c42affdedc05a2b60ab89d7406d709bfc05396 100644 (file)
@@ -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
index 9164a0745b21f81017c5833e5611b37380630b46..8af09e50295535048b2f9f7105bd24ea2ab968e1 100644 (file)
@@ -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)