aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/parser.cc48
-rw-r--r--gcc/testsuite/g++.dg/DRs/dr2262.C16
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/gen-attrs-76.C8
-rw-r--r--gcc/testsuite/g++.dg/gomp/attrs-11.C4
4 files changed, 55 insertions, 21 deletions
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 676edf4..1049a75 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -15398,7 +15398,6 @@ cp_parser_block_declaration (cp_parser *parser,
/* Peek at the next token to figure out which kind of declaration is
present. */
cp_token *token1 = cp_lexer_peek_token (parser->lexer);
- size_t attr_idx;
/* If the next keyword is `asm', we have an asm-definition. */
if (token1->keyword == RID_ASM)
@@ -15452,22 +15451,36 @@ cp_parser_block_declaration (cp_parser *parser,
/* If the next token is `static_assert' we have a static assertion. */
else if (token1->keyword == RID_STATIC_ASSERT)
cp_parser_static_assert (parser, /*member_p=*/false);
- /* If the next tokens after attributes is `using namespace', then we have
- a using-directive. */
- else if ((attr_idx = cp_parser_skip_std_attribute_spec_seq (parser, 1)) != 1
- && cp_lexer_nth_token_is_keyword (parser->lexer, attr_idx,
- RID_USING)
- && cp_lexer_nth_token_is_keyword (parser->lexer, attr_idx + 1,
- RID_NAMESPACE))
+ else
{
- if (statement_p)
- cp_parser_commit_to_tentative_parse (parser);
- cp_parser_using_directive (parser);
+ size_t attr_idx = cp_parser_skip_std_attribute_spec_seq (parser, 1);
+ cp_token *after_attr = NULL;
+ if (attr_idx != 1)
+ after_attr = cp_lexer_peek_nth_token (parser->lexer, attr_idx);
+ /* If the next tokens after attributes is `using namespace', then we have
+ a using-directive. */
+ if (after_attr
+ && after_attr->keyword == RID_USING
+ && cp_lexer_nth_token_is_keyword (parser->lexer, attr_idx + 1,
+ RID_NAMESPACE))
+ {
+ if (statement_p)
+ cp_parser_commit_to_tentative_parse (parser);
+ cp_parser_using_directive (parser);
+ }
+ /* If the next token after attributes is `asm', then we have
+ an asm-definition. */
+ else if (after_attr && after_attr->keyword == RID_ASM)
+ {
+ if (statement_p)
+ cp_parser_commit_to_tentative_parse (parser);
+ cp_parser_asm_definition (parser);
+ }
+ /* Anything else must be a simple-declaration. */
+ else
+ cp_parser_simple_declaration (parser, !statement_p,
+ /*maybe_range_for_decl*/NULL);
}
- /* Anything else must be a simple-declaration. */
- else
- cp_parser_simple_declaration (parser, !statement_p,
- /*maybe_range_for_decl*/NULL);
}
/* Parse a simple-declaration.
@@ -22424,6 +22437,7 @@ cp_parser_asm_definition (cp_parser* parser)
bool invalid_inputs_p = false;
bool invalid_outputs_p = false;
required_token missing = RT_NONE;
+ tree std_attrs = cp_parser_std_attribute_spec_seq (parser);
location_t asm_loc = cp_lexer_peek_token (parser->lexer)->location;
/* Look for the `asm' keyword. */
@@ -22657,6 +22671,10 @@ cp_parser_asm_definition (cp_parser* parser)
else
symtab->finalize_toplevel_asm (string);
}
+
+ if (std_attrs)
+ warning_at (asm_loc, OPT_Wattributes,
+ "attributes ignored on %<asm%> declaration");
}
/* Given the type TYPE of a declaration with declarator DECLARATOR, return the
diff --git a/gcc/testsuite/g++.dg/DRs/dr2262.C b/gcc/testsuite/g++.dg/DRs/dr2262.C
new file mode 100644
index 0000000..88b8a31
--- /dev/null
+++ b/gcc/testsuite/g++.dg/DRs/dr2262.C
@@ -0,0 +1,16 @@
+// DR 2262 - Attributes for asm-definition
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wattributes" }
+
+[[]] asm ("nop");
+[[foo::bar]] asm ("nop"); // { dg-warning "attributes ignored on 'asm' declaration" }
+
+void
+foo ()
+{
+ int i = 42;
+ [[]] asm ("nop");
+ [[foo::bar]] asm ("nop"); // { dg-warning "attributes ignored on 'asm' declaration" }
+ [[]] asm ("nop" : "+r" (i));
+ [[foo::bar]] [[bar::baz]] asm ("nop" : "+r" (i)); // { dg-warning "attributes ignored on 'asm' declaration" }
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-76.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-76.C
index 72cd4b3..eba88fb 100644
--- a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-76.C
+++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-76.C
@@ -8,9 +8,9 @@ namespace P {}
void
foo ()
{
- [[]] asm (""); // { dg-error "expected" }
+ [[]] asm ("");
[[]] __extension__ asm (""); // { dg-error "expected" }
- __extension__ [[]] asm (""); // { dg-error "expected" }
+ __extension__ [[]] asm ("");
[[]] namespace M = ::N; // { dg-error "expected" }
[[]] using namespace N; // { dg-bogus "expected" }
using namespace P [[]]; // { dg-error "expected" }
@@ -22,9 +22,9 @@ foo ()
void
bar ()
{
- [[gnu::unused]] asm (""); // { dg-error "expected" }
+ [[gnu::unused]] asm ("");
[[gnu::unused]] __extension__ asm (""); // { dg-error "expected" }
- __extension__ [[gnu::unused]] asm (""); // { dg-error "expected" }
+ __extension__ [[gnu::unused]] asm ("");
[[gnu::unused]] namespace M = ::N; // { dg-error "expected" }
[[gnu::unused]] using namespace N; // { dg-bogus "expected" }
using namespace P [[gnu::unused]]; // { dg-error "expected" }
diff --git a/gcc/testsuite/g++.dg/gomp/attrs-11.C b/gcc/testsuite/g++.dg/gomp/attrs-11.C
index 44e025e..6cc02d4 100644
--- a/gcc/testsuite/g++.dg/gomp/attrs-11.C
+++ b/gcc/testsuite/g++.dg/gomp/attrs-11.C
@@ -7,9 +7,9 @@ namespace O { typedef int T; };
void
foo ()
{
- [[omp::directive (parallel)]] asm (""); // { dg-error "expected" }
+ [[omp::directive (parallel)]] asm ("");
[[omp::directive (parallel)]] __extension__ asm (""); // { dg-error "expected" }
- __extension__ [[omp::directive (parallel)]] asm (""); // { dg-error "expected" }
+ __extension__ [[omp::directive (parallel)]] asm ("");
[[omp::directive (parallel)]] namespace M = ::N; // { dg-error "expected" }
[[omp::directive (parallel)]] using namespace N; // { dg-error "not allowed to be specified in this context" }
[[omp::directive (parallel)]] using O::T; // { dg-error "expected" }