From 599aabbf0ab20efcdcc7c89a8708e3dd95daac49 Mon Sep 17 00:00:00 2001 From: Matthias Klose Date: Sun, 10 Mar 2019 07:25:13 +0000 Subject: [PATCH] backport: re PR c++/89585 (GCC 8.3: asm volatile no longer accepted at file scope) gcc/cp/ 2019-04-10 Matthias Klose Backport from the gcc-8 branch 2019-03-07 Jakub Jelinek PR c++/89585 * parser.c (cp_parser_asm_definition): Parse asm qualifiers even at toplevel, but diagnose them. gcc/testsuite/ 2019-04-10 Matthias Klose Backport from the gcc-8 branch 2019-03-07 Jakub Jelinek PR c++/89585 * g++.dg/asm-qual-3.C: Adjust expected diagnostics. From-SVN: r269546 --- gcc/cp/ChangeLog | 9 +++++++++ gcc/cp/parser.c | 13 ++++++++++++- gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/g++.dg/asm-qual-3.C | 8 ++++---- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c53684fafd61..f9d983655179 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2019-04-10 Matthias Klose + + Backport from the gcc-8 branch + 2019-03-07 Jakub Jelinek + + PR c++/89585 + * parser.c (cp_parser_asm_definition): Parse asm qualifiers even + at toplevel, but diagnose them. + 2018-01-02 Segher Boessenkool Backport from trunk diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 1f80a3c60d06..a29b3940ab0e 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -18847,8 +18847,9 @@ cp_parser_asm_definition (cp_parser* parser) location_t volatile_loc = UNKNOWN_LOCATION; location_t inline_loc = UNKNOWN_LOCATION; location_t goto_loc = UNKNOWN_LOCATION; + location_t first_loc = UNKNOWN_LOCATION; - if (cp_parser_allow_gnu_extensions_p (parser) && parser->in_function_body) + if (cp_parser_allow_gnu_extensions_p (parser)) for (;;) { cp_token *token = cp_lexer_peek_token (parser->lexer); @@ -18874,6 +18875,8 @@ cp_parser_asm_definition (cp_parser* parser) } else inline_loc = loc; + if (!first_loc) + first_loc = loc; cp_lexer_consume_token (parser->lexer); continue; @@ -18885,6 +18888,8 @@ cp_parser_asm_definition (cp_parser* parser) } else goto_loc = loc; + if (!first_loc) + first_loc = loc; cp_lexer_consume_token (parser->lexer); continue; @@ -18904,6 +18909,12 @@ cp_parser_asm_definition (cp_parser* parser) bool inline_p = (inline_loc != UNKNOWN_LOCATION); bool goto_p = (goto_loc != UNKNOWN_LOCATION); + if (!parser->in_function_body && (inline_p || goto_p)) + { + error_at (first_loc, "asm qualifier outside of function body"); + inline_p = goto_p = false; + } + /* Look for the opening `('. */ if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN)) return; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3622271345a6..bb8077a41329 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2019-04-10 Matthias Klose + + Backport from the gcc-8 branch + 2019-03-07 Jakub Jelinek + + PR c++/89585 + * g++.dg/asm-qual-3.C: Adjust expected diagnostics. + 2019-03-07 Xiong Hu Luo Backport of r268834 from mainline to gcc-7-branch. diff --git a/gcc/testsuite/g++.dg/asm-qual-3.C b/gcc/testsuite/g++.dg/asm-qual-3.C index 95c9b570a5f8..6faf0ef5e06e 100644 --- a/gcc/testsuite/g++.dg/asm-qual-3.C +++ b/gcc/testsuite/g++.dg/asm-qual-3.C @@ -2,11 +2,11 @@ // { dg-do compile } // { dg-options "-std=gnu++98" } -asm const (""); // { dg-error {expected '\(' before 'const'} } -asm volatile (""); // { dg-error {expected '\(' before 'volatile'} } +asm const (""); // { dg-error {'const' is not an asm qualifier} } +asm volatile (""); asm restrict (""); // { dg-error {expected '\(' before 'restrict'} } -asm inline (""); // { dg-error {expected '\(' before 'inline'} } -asm goto (""); // { dg-error {expected '\(' before 'goto'} } +asm inline (""); // { dg-error {asm qualifier outside of function body} } +asm goto (""); // { dg-error {asm qualifier outside of function body} } // There are many other things wrong with this code, so: // { dg-excess-errors "" } -- 2.47.2