aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2024-08-30 16:02:10 -0400
committerJason Merrill <jason@redhat.com>2024-09-03 17:59:18 -0400
commit3775f71c8909b3531fe002138814fa2504ec2e8b (patch)
tree41129409f0a838cd0f8774d6f28cb5d3cd320834 /gcc
parent1fad396dd467326251572811b703e788e62a2588 (diff)
downloadgcc-3775f71c8909b3531fe002138814fa2504ec2e8b.zip
gcc-3775f71c8909b3531fe002138814fa2504ec2e8b.tar.gz
gcc-3775f71c8909b3531fe002138814fa2504ec2e8b.tar.bz2
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__.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/error.cc7
-rw-r--r--gcc/cp/parser.cc9
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/gen-attrs-1.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/gen-attrs-11.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/gen-attrs-13.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/gen-attrs-15.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/gen-attrs-75.C10
7 files changed, 17 insertions, 17 deletions
diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc
index 57cd76c..4a9e9aa 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 edfa5a4..64122d9 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 c2cf912..b1625d9 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 504b456..040f15c 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 a1b4a84..8997b84 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 bf05dbe..8b552ca 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 bac80aa..c2a328c 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__ [[]][[]];
}