From a31dc4e516d2816c6be4c5f7329718223fced1e3 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Wed, 1 Jul 2015 09:08:17 +0000 Subject: [PATCH] re PR c++/60365 (multiple noreturn attribute specifiers in a single declaration doesn't result in a diagnostic) /cp 2015-07-01 Paolo Carlini PR c++/60365 * parser.c (cp_parser_check_std_attribute): New. (cp_parser_std_attribute_list): Call it. /testsuite 2015-07-01 Paolo Carlini PR c++/60365 * g++.dg/cpp0x/gen-attrs-60.C: New. * g++.dg/cpp1y/attr-deprecated-2.C: Likewise. From-SVN: r225234 --- gcc/cp/ChangeLog | 6 +++++ gcc/cp/parser.c | 23 +++++++++++++++++++ gcc/testsuite/ChangeLog | 8 ++++++- gcc/testsuite/g++.dg/cpp0x/gen-attrs-60.C | 4 ++++ .../g++.dg/cpp1y/attr-deprecated-2.C | 4 ++++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/gen-attrs-60.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/attr-deprecated-2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e3436418259..33fe38e2bbb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2015-07-01 Paolo Carlini + + PR c++/60365 + * parser.c (cp_parser_check_std_attribute): New. + (cp_parser_std_attribute_list): Call it. + 2015-07-01 Patrick Palka PR c++/66686 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index bb3d636eee1..35191a1cabc 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -22535,6 +22535,28 @@ cp_parser_std_attribute (cp_parser *parser) return attribute; } +/* Check that the attribute ATTRIBUTE appears at most once in the + attribute-list ATTRIBUTES. This is enforced for noreturn (7.6.3) + and deprecated (7.6.5). Note that carries_dependency (7.6.4) + isn't implemented yet in GCC. */ + +static void +cp_parser_check_std_attribute (tree attributes, tree attribute) +{ + if (attributes) + { + tree name = get_attribute_name (attribute); + if (is_attribute_p ("noreturn", name) + && lookup_attribute ("noreturn", attributes)) + error ("attribute noreturn can appear at most once " + "in an attribute-list"); + else if (is_attribute_p ("deprecated", name) + && lookup_attribute ("deprecated", attributes)) + error ("attribute deprecated can appear at most once " + "in an attribute-list"); + } +} + /* Parse a list of standard C++-11 attributes. attribute-list: @@ -22557,6 +22579,7 @@ cp_parser_std_attribute_list (cp_parser *parser) break; if (attribute != NULL_TREE) { + cp_parser_check_std_attribute (attributes, attribute); TREE_CHAIN (attribute) = attributes; attributes = attribute; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8f768136eab..65ce5f960de 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,12 @@ +2015-07-01 Paolo Carlini + + PR c++/60365 + * g++.dg/cpp0x/gen-attrs-60.C: New. + * g++.dg/cpp1y/attr-deprecated-2.C: Likewise. + 2015-07-01 Jiong Wang - * lib/target-supports.exp (check_effective_target_aarch64_small_fpic): New function. + * lib/target-supports.exp (check_effective_target_aarch64_small_fpic):New function. * gcc.target/aarch64/pic-small.c: Restrict this test under check_effective_target_aarch64_small_fpic. diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-60.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-60.C new file mode 100644 index 00000000000..cb0c31ec63f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-60.C @@ -0,0 +1,4 @@ +// PR c++/60365 +// { dg-do compile { target c++11 } } + +void func [[noreturn, noreturn]] (); // { dg-error "at most once" } diff --git a/gcc/testsuite/g++.dg/cpp1y/attr-deprecated-2.C b/gcc/testsuite/g++.dg/cpp1y/attr-deprecated-2.C new file mode 100644 index 00000000000..12c75c7ba73 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/attr-deprecated-2.C @@ -0,0 +1,4 @@ +// PR c++/60365 +// { dg-do compile { target c++14 } } + +void func [[deprecated, deprecated]] (); // { dg-error "at most once" } -- 2.30.2