lex.c (lex_string): Add -Wc++11-compat warning.
authorJason Merrill <jason@redhat.com>
Sat, 9 May 2015 04:50:10 +0000 (00:50 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 9 May 2015 04:50:10 +0000 (00:50 -0400)
libcpp/
* lex.c (lex_string): Add -Wc++11-compat warning.
* include/cpplib.h: Add CPP_W_CXX11_COMPAT.
(struct cpp_options): Add cpp_warn_cxx11_compat.
* init.c (cpp_create_reader): Initialize it.
gcc/c-family/
* c.opt (Wc++0x-compat): Set it.

From-SVN: r222961

gcc/c-family/ChangeLog
gcc/c-family/c.opt
gcc/testsuite/g++.dg/cpp0x/warn_cxx0x4.C [new file with mode: 0644]
libcpp/ChangeLog
libcpp/include/cpplib.h
libcpp/init.c
libcpp/lex.c

index 57f83c9..17fb72f 100644 (file)
@@ -1,3 +1,7 @@
+2015-05-08  Jason Merrill  <jason@redhat.com>
+
+       * c.opt (Wc++0x-compat): Also set cpp_warn_cxx11_compat.
+
 2015-05-08  Marek Polacek  <polacek@redhat.com>
 
        PR c/64918
index 3774a89..8f48d84 100644 (file)
@@ -312,7 +312,7 @@ C ObjC Var(warn_cxx_compat) CPP(warn_cxx_operator_names) CppReason(CPP_W_CXX_OPE
 Warn about C constructs that are not in the common subset of C and C++
 
 Wc++0x-compat
-C++ ObjC++ Var(warn_cxx0x_compat) Warning LangEnabledBy(C++ ObjC++,Wall)
+C++ ObjC++ Var(warn_cxx0x_compat) Warning LangEnabledBy(C++ ObjC++,Wall) Init(0) CPP(cpp_warn_cxx11_compat) CppReason(CPP_W_CXX11_COMPAT)
 Deprecated in favor of -Wc++11-compat
 
 Wc++11-compat
diff --git a/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x4.C b/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x4.C
new file mode 100644 (file)
index 0000000..c3f0cf5
--- /dev/null
@@ -0,0 +1,4 @@
+// { dg-options "-Wall" }
+
+#define FOO "foo"
+const char *p = "bar"FOO;      // { dg-warning "macro" }
index 6a2e0fb..5130442 100644 (file)
@@ -1,3 +1,10 @@
+2015-05-08  Jason Merrill  <jason@redhat.com>
+
+       * include/cpplib.h: Add CPP_W_CXX11_COMPAT.
+       (struct cpp_options): Add cpp_warn_cxx11_compat.
+       * init.c (cpp_create_reader): Initialize it.
+       * lex.c (lex_string): Add -Wc++11-compat warning.
+
 2015-05-05  David Malcolm  <dmalcolm@redhat.com>
 
        * pch.c (cpp_valid_state): Fix indentation so that it reflects the
index 5e08014..0152ec8 100644 (file)
@@ -484,6 +484,9 @@ struct cpp_options
   /* True if warn about differences between C90 and C99.  */
   signed char cpp_warn_c90_c99_compat;
 
+  /* True if warn about differences between C++98 and C++11.  */
+  bool cpp_warn_cxx11_compat;
+
   /* Dependency generation.  */
   struct
   {
@@ -960,7 +963,8 @@ enum {
   CPP_W_LITERAL_SUFFIX,
   CPP_W_DATE_TIME,
   CPP_W_PEDANTIC,
-  CPP_W_C90_C99_COMPAT
+  CPP_W_C90_C99_COMPAT,
+  CPP_W_CXX11_COMPAT
 };
 
 /* Output a diagnostic of some kind.  */
index 45a4d13..1ebd709 100644 (file)
@@ -180,6 +180,7 @@ cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
   CPP_OPTION (pfile, warn_trigraphs) = 2;
   CPP_OPTION (pfile, warn_endif_labels) = 1;
   CPP_OPTION (pfile, cpp_warn_c90_c99_compat) = -1;
+  CPP_OPTION (pfile, cpp_warn_cxx11_compat) = 0;
   CPP_OPTION (pfile, cpp_warn_deprecated) = 1;
   CPP_OPTION (pfile, cpp_warn_long_long) = 0;
   CPP_OPTION (pfile, dollars_in_ident) = 1;
index ac96ff8..c7296a1 100644 (file)
@@ -1905,6 +1905,12 @@ lex_string (cpp_reader *pfile, cpp_token *token, const uchar *base)
            ++cur;
        }
     }
+  else if (CPP_OPTION (pfile, cpp_warn_cxx11_compat)
+          && is_macro (pfile, cur)
+          && !pfile->state.skipping)
+    cpp_warning_with_line (pfile, CPP_W_CXX11_COMPAT,
+                          token->src_loc, 0, "C++11 requires a space "
+                          "between string literal and macro");
 
   pfile->buffer->cur = cur;
   create_literal (pfile, token, base, cur - base, type);