Allow [[deprecated]] even for C++11 (with pedwarn)

Ed Smith-Rowland 3dw4rd@verizon.net
Sun Oct 5 22:01:00 GMT 2014


Greetings,

There was some feeling that not allowing [[deprecated]] for C++ was a 
little extreme.

This patch builds and tests clean on x86_64-linux.  OK?

Ed

-------------- next part --------------

gcc/c-family:

2014-10-06  Edward Smith-Rowland  <3dw4rd@verizon.net>

	* c-family/c-cppbuiltin.c: Move __cpp_attribute_deprecated to the
	C++11 section.


gcc/cp:

2014-10-06  Edward Smith-Rowland  <3dw4rd@verizon.net>

	* cp/parser.c: Allow [[deprecated]] for C++11.  Issue a pedwarn.


gcc/testsuite:

2014-10-06  Edward Smith-Rowland  <3dw4rd@verizon.net>

	* g++.dg/cpp1y/attr-deprecated-neg.C: Attribute no longer ignored.
	* g++.dg/cpp1y/feat-cxx11-neg.C: Comment out __cpp_attribute_deprecated test.
	* g++.dg/cpp1y/feat-cxx11.C: Add __cpp_attribute_deprecated test.

-------------- next part --------------
Index: c-family/c-cppbuiltin.c
===================================================================
--- c-family/c-cppbuiltin.c	(revision 215826)
+++ c-family/c-cppbuiltin.c	(working copy)
@@ -828,6 +828,7 @@
 	  cpp_define (pfile, "__cpp_rvalue_reference=200610");
 	  cpp_define (pfile, "__cpp_variadic_templates=200704");
 	  cpp_define (pfile, "__cpp_alias_templates=200704");
+	  cpp_define (pfile, "__cpp_attribute_deprecated=201309");
 	}
       if (cxx_dialect > cxx11)
 	{
@@ -841,7 +842,6 @@
 	  //cpp_define (pfile, "__cpp_aggregate_nsdmi=201304");
 	  cpp_define (pfile, "__cpp_variable_templates=201304");
 	  cpp_define (pfile, "__cpp_digit_separators=201309");
-	  cpp_define (pfile, "__cpp_attribute_deprecated=201309");
 	  //cpp_define (pfile, "__cpp_sized_deallocation=201309");
 	  /* We'll have to see where runtime arrays wind up.
 	     Let's put it in C++14 for now.  */
Index: cp/parser.c
===================================================================
--- cp/parser.c	(revision 215826)
+++ cp/parser.c	(working copy)
@@ -22211,8 +22211,14 @@
       if (is_attribute_p ("noreturn", attr_id))
 	TREE_PURPOSE (TREE_PURPOSE (attribute)) = get_identifier ("gnu");
       /* C++14 deprecated attribute is equivalent to GNU's.  */
-      else if (cxx_dialect >= cxx14 && is_attribute_p ("deprecated", attr_id))
-	TREE_PURPOSE (TREE_PURPOSE (attribute)) = get_identifier ("gnu");
+      else if (cxx_dialect >= cxx11 && is_attribute_p ("deprecated", attr_id))
+	{
+	  if (cxx_dialect == cxx11)
+	    pedwarn (token->location, OPT_Wpedantic,
+		     "%<deprecated%> is a C++14 feature;"
+		     " use %<gnu::deprecated%>");
+	  TREE_PURPOSE (TREE_PURPOSE (attribute)) = get_identifier ("gnu");
+	}
     }
 
   /* Now parse the optional argument clause of the attribute.  */
Index: testsuite/g++.dg/cpp1y/attr-deprecated-neg.C
===================================================================
--- testsuite/g++.dg/cpp1y/attr-deprecated-neg.C	(revision 215826)
+++ testsuite/g++.dg/cpp1y/attr-deprecated-neg.C	(working copy)
@@ -1,23 +1,24 @@
 // { dg-do compile { target c++11_only } }
+// { dg-options "-pedantic" }
 
-class [[deprecated]] A // { dg-warning "attribute directive ignored" }
+class [[deprecated]] A // { dg-warning "'deprecated' is a C..14 feature" }
 {
 };
 
-[[deprecated]]
+[[deprecated]] // { dg-warning "'deprecated' is a C..14 feature" }
 int
-foo(int n) // { dg-warning "attribute directive ignored" }
+foo(int n)
 {
   return 42 + n;
 }
 
-class [[deprecated("B has been superceded by C")]] B // { dg-warning "attribute directive ignored" }
+class [[deprecated("B has been superceded by C")]] B // { dg-warning "'deprecated' is a C..14 feature" }
 {
 };
 
-[[deprecated("bar is unsafe; use foobar instead")]]
+[[deprecated("bar is unsafe; use foobar instead")]] // { dg-warning "'deprecated' is a C..14 feature" }
 int
-bar(int n) // { dg-warning "attribute directive ignored" }
+bar(int n)
 {
   return 42 + n - 1;
 }
@@ -47,12 +48,12 @@
 int
 main()
 {
-  A aaa;
-  int n = foo(12);
+  A aaa; // { dg-warning "is deprecated" }
+  int n = foo(12); // { dg-warning "is deprecated" }
 
-  B bbb;
-  int m = bar(666);
+  B bbb; // { dg-warning "is deprecated" }
+  int m = bar(666); // { dg-warning "is deprecated" }
 
-  C ccc;
-  int l = foobar(8);
+  C ccc; // { dg-warning "is deprecated" "" { target { c++14 } } }
+  int l = foobar(8); // { dg-warning "is deprecated" "" { target { c++14 } } }
 }
Index: testsuite/g++.dg/cpp1y/feat-cxx11-neg.C
===================================================================
--- testsuite/g++.dg/cpp1y/feat-cxx11-neg.C	(revision 215826)
+++ testsuite/g++.dg/cpp1y/feat-cxx11-neg.C	(working copy)
@@ -31,9 +31,10 @@
 #  error "__cpp_digit_separators" // { dg-error "error" }
 #endif
 
-#ifndef __cpp_attribute_deprecated
-#  error "__cpp_attribute_deprecated" // { dg-error "error" }
-#endif
+//  Attribute [[deprecated]] is allowed in C++11 as an extension (with pedwarn).
+//#ifndef __cpp_attribute_deprecated
+//#  error "__cpp_attribute_deprecated"
+//#endif
 
 #ifndef __cpp_runtime_arrays
 #  error "__cpp_runtime_arrays" // { dg-error "error" }
Index: testsuite/g++.dg/cpp1y/feat-cxx11.C
===================================================================
--- testsuite/g++.dg/cpp1y/feat-cxx11.C	(revision 215826)
+++ testsuite/g++.dg/cpp1y/feat-cxx11.C	(working copy)
@@ -79,3 +79,9 @@
 #elif __cpp_binary_literals != 201304
 #  error "__cpp_binary_literals != 201304"
 #endif
+
+#ifndef __cpp_attribute_deprecated
+#  error "__cpp_attribute_deprecated"
+#elif __cpp_attribute_deprecated != 201309
+#  error "__cpp_attribute_deprecated != 201309"
+#endif


More information about the Gcc-patches mailing list