https://gcc.gnu.org/g:3775f71c8909b3531fe002138814fa2504ec2e8b

commit r15-3433-g3775f71c8909b3531fe002138814fa2504ec2e8b
Author: Jason Merrill <ja...@redhat.com>
Date:   Fri Aug 30 16:02:10 2024 -0400

    c++: support C++11 attributes in C++98
    
    I don't see any reason why we can't allow the [[]] attribute syntax in C++98
    mode with a pedwarn just like many other C++11 features.  In fact, we
    already do support it in some places in the grammar, but not in places that
    check cp_nth_tokens_can_be_std_attribute_p.
    
    Let's also follow the C front-end's lead in only warning about them when
    -pedantic.
    
    It still isn't necessary for this function to guard against Objective-C
    message passing syntax; we handle that with tentative parsing in
    cp_parser_statement, and we don't call this function in that context anyway.
    
    gcc/cp/ChangeLog:
    
            * parser.cc (cp_nth_tokens_can_be_std_attribute_p): Don't check
            cxx_dialect.
            * error.cc (maybe_warn_cpp0x): Only complain about C++11 attributes
            if pedantic.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp0x/gen-attrs-1.C: Also run in C++98 mode.
            * g++.dg/cpp0x/gen-attrs-11.C: Likewise.
            * g++.dg/cpp0x/gen-attrs-13.C: Likewise.
            * g++.dg/cpp0x/gen-attrs-15.C: Likewise.
            * g++.dg/cpp0x/gen-attrs-75.C: Don't expect C++98 warning after
            __extension__.

Diff:
---
 gcc/cp/error.cc                           |  7 ++++---
 gcc/cp/parser.cc                          |  9 ++++-----
 gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C  |  2 +-
 gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C |  2 +-
 gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C |  2 +-
 gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C |  2 +-
 gcc/testsuite/g++.dg/cpp0x/gen-attrs-75.C | 10 +++++-----
 7 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc
index 57cd76caf490..4a9e9aa3cdcb 100644
--- a/gcc/cp/error.cc
+++ b/gcc/cp/error.cc
@@ -4735,9 +4735,10 @@ maybe_warn_cpp0x (cpp0x_warn_str str, location_t 
loc/*=input_location*/)
                 "only available with %<-std=c++11%> or %<-std=gnu++11%>");
         break;
       case CPP0X_ATTRIBUTES:
-       pedwarn (loc, OPT_Wc__11_extensions,
-                "C++11 attributes "
-                "only available with %<-std=c++11%> or %<-std=gnu++11%>");
+       if (pedantic)
+         pedwarn (loc, OPT_Wc__11_extensions,
+                  "C++11 attributes "
+                  "only available with %<-std=c++11%> or %<-std=gnu++11%>");
        break;
       case CPP0X_REF_QUALIFIER:
        pedwarn (loc, OPT_Wc__11_extensions,
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index edfa5a494405..64122d937fa5 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -29924,11 +29924,10 @@ cp_nth_tokens_can_be_std_attribute_p (cp_parser 
*parser, size_t n)
 {
   cp_token *token = cp_lexer_peek_nth_token (parser->lexer, n);
 
-  return (cxx_dialect >= cxx11
-         && ((token->type == CPP_KEYWORD && token->keyword == RID_ALIGNAS)
-             || (token->type == CPP_OPEN_SQUARE
-                 && (token = cp_lexer_peek_nth_token (parser->lexer, n + 1))
-                 && token->type == CPP_OPEN_SQUARE)));
+  return ((token->type == CPP_KEYWORD && token->keyword == RID_ALIGNAS)
+         || (token->type == CPP_OPEN_SQUARE
+             && (token = cp_lexer_peek_nth_token (parser->lexer, n + 1))
+             && token->type == CPP_OPEN_SQUARE));
 }
 
 /* Return TRUE iff the next Nth tokens in the stream are possibly the
diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C 
b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C
index c2cf912047e9..b1625d969167 100644
--- a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C
+++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C
@@ -1,3 +1,3 @@
-// { dg-do compile { target c++11 } }
+// { dg-additional-options "-Wno-c++11-extensions" }
 
 int **** [[gnu::format(printf, 1, 2)]] foo(const char *, ...); // { dg-warning 
"only applies to function types" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C 
b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C
index 504b4565679c..040f15c9dbb9 100644
--- a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C
+++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C
@@ -1,4 +1,4 @@
-// { dg-do compile { target c++11 } }
+// { dg-additional-options "-Wno-c++11-extensions" }
 // PR c++/13791
 
 template <typename T> struct O {
diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C 
b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C
index a1b4a84b7e54..8997b845dfd9 100644
--- a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C
+++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C
@@ -1,4 +1,4 @@
-// { dg-do compile { target c++11 } }
+// { dg-additional-options "-Wno-c++11-extensions" }
 // PR c++/13854
 
 extern char *rindex [[gnu::__pure__]] (__const char *__s, int __c) throw ();
diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C 
b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C
index bf05dbeb31b9..8b552ca1fbe2 100644
--- a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C
+++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C
@@ -1,4 +1,4 @@
-// { dg-do compile { target c++11 } }
+// { dg-additional-options "-Wno-c++11-extensions" }
 // PR c++/15317
 
 struct A
diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-75.C 
b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-75.C
index bac80aa02ffb..c2a328c7c7ff 100644
--- a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-75.C
+++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-75.C
@@ -1,6 +1,6 @@
 // PR c++/101582
 // { dg-do compile }
-// { dg-options "" }
+// { dg-options "-pedantic -Wno-extra-semi" }
 
 ;
 [[]] [[]] [[]];        // { dg-warning "attributes only available with" "" { 
target c++98_only } }
@@ -12,9 +12,9 @@ extern "C" [[]];      // { dg-warning "attributes only 
available with" "" { target c+
 extern "C" extern "C" ;
 extern "C" extern "C" [[]][[]][[]];    // { dg-warning "attributes only 
available with" "" { target c++98_only } }
 __extension__ ;
-__extension__ [[]];                    // { dg-warning "attributes only 
available with" "" { target c++98_only } }
+__extension__ [[]];
 __extension__ __extension__ ;
-__extension__ __extension__ [[]][[]];  // { dg-warning "attributes only 
available with" "" { target c++98_only } }
+__extension__ __extension__ [[]][[]];
 
 namespace N {
 
@@ -28,8 +28,8 @@ extern "C" [[]];      // { dg-warning "attributes only 
available with" "" { target c+
 extern "C" extern "C" ;
 extern "C" extern "C" [[]][[]][[]];    // { dg-warning "attributes only 
available with" "" { target c++98_only } }
 __extension__ ;
-__extension__ [[]];                    // { dg-warning "attributes only 
available with" "" { target c++98_only } }
+__extension__ [[]];
 __extension__ __extension__ ;
-__extension__ __extension__ [[]][[]];  // { dg-warning "attributes only 
available with" "" { target c++98_only } }
+__extension__ __extension__ [[]][[]];
 
 }

Reply via email to