mirror of
git://slackware.nl/current.git
synced 2025-01-13 08:01:53 +01:00
104 lines
3.7 KiB
Diff
104 lines
3.7 KiB
Diff
|
From patchwork Thu Dec 27 14:59:12 2018
|
||
|
Content-Type: text/plain; charset="utf-8"
|
||
|
MIME-Version: 1.0
|
||
|
Content-Transfer-Encoding: 7bit
|
||
|
Subject: [7/8] c++, asm: Do not handle any asm-qualifiers in top-level asm
|
||
|
X-Patchwork-Submitter: Segher Boessenkool <segher@kernel.crashing.org>
|
||
|
X-Patchwork-Id: 13824
|
||
|
Message-Id: <7d103b408f9dda95b9d9f5182281ae6bb3947716.1545922222.git.segher@kernel.crashing.org>
|
||
|
To: gcc-patches@gcc.gnu.org
|
||
|
Cc: Segher Boessenkool <segher@kernel.crashing.org>
|
||
|
Date: Thu, 27 Dec 2018 14:59:12 +0000
|
||
|
From: Segher Boessenkool <segher@kernel.crashing.org>
|
||
|
List-Id: <gcc-patches.gcc.gnu.org>
|
||
|
|
||
|
Previously, "volatile" was allowed. Changing this simplifies the code,
|
||
|
makes things more regular, and makes the C and C++ frontends handle
|
||
|
this the same way.
|
||
|
|
||
|
2018-12-10 Segher Boessenkool <segher@kernel.crashing.org>
|
||
|
|
||
|
cp/
|
||
|
* parser.c (cp_parser_asm_definition): Do not allow any asm qualifiers
|
||
|
on top-level asm.
|
||
|
|
||
|
testsuite/
|
||
|
* g++.dg/asm-qual-3.C: New testcase.
|
||
|
* gcc.dg/asm-qual-3.c: New testcase.
|
||
|
---
|
||
|
gcc/cp/parser.c | 7 ++-----
|
||
|
gcc/testsuite/g++.dg/asm-qual-3.C | 12 ++++++++++++
|
||
|
gcc/testsuite/gcc.dg/asm-qual-3.c | 9 +++++++++
|
||
|
3 files changed, 23 insertions(+), 5 deletions(-)
|
||
|
create mode 100644 gcc/testsuite/g++.dg/asm-qual-3.C
|
||
|
create mode 100644 gcc/testsuite/gcc.dg/asm-qual-3.c
|
||
|
|
||
|
--
|
||
|
1.8.3.1
|
||
|
|
||
|
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
|
||
|
index 36d82b8..afc7b96 100644
|
||
|
--- a/gcc/cp/parser.c
|
||
|
+++ b/gcc/cp/parser.c
|
||
|
@@ -19125,7 +19125,8 @@ 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;
|
||
|
- if (cp_parser_allow_gnu_extensions_p (parser))
|
||
|
+
|
||
|
+ if (cp_parser_allow_gnu_extensions_p (parser) && parser->in_function_body)
|
||
|
for (;;)
|
||
|
{
|
||
|
cp_token *token = cp_lexer_peek_token (parser->lexer);
|
||
|
@@ -19144,8 +19145,6 @@ cp_parser_asm_definition (cp_parser* parser)
|
||
|
continue;
|
||
|
|
||
|
case RID_INLINE:
|
||
|
- if (!parser->in_function_body)
|
||
|
- break;
|
||
|
if (inline_loc)
|
||
|
{
|
||
|
error_at (loc, "duplicate asm qualifier %qT", token->u.value);
|
||
|
@@ -19157,8 +19156,6 @@ cp_parser_asm_definition (cp_parser* parser)
|
||
|
continue;
|
||
|
|
||
|
case RID_GOTO:
|
||
|
- if (!parser->in_function_body)
|
||
|
- break;
|
||
|
if (goto_loc)
|
||
|
{
|
||
|
error_at (loc, "duplicate asm qualifier %qT", token->u.value);
|
||
|
diff --git a/gcc/testsuite/g++.dg/asm-qual-3.C b/gcc/testsuite/g++.dg/asm-qual-3.C
|
||
|
new file mode 100644
|
||
|
index 0000000..95c9b57
|
||
|
--- /dev/null
|
||
|
+++ b/gcc/testsuite/g++.dg/asm-qual-3.C
|
||
|
@@ -0,0 +1,12 @@
|
||
|
+// Test that asm-qualifiers are not allowed on toplevel asm.
|
||
|
+// { dg-do compile }
|
||
|
+// { dg-options "-std=gnu++98" }
|
||
|
+
|
||
|
+asm const (""); // { dg-error {expected '\(' before 'const'} }
|
||
|
+asm volatile (""); // { dg-error {expected '\(' before 'volatile'} }
|
||
|
+asm restrict (""); // { dg-error {expected '\(' before 'restrict'} }
|
||
|
+asm inline (""); // { dg-error {expected '\(' before 'inline'} }
|
||
|
+asm goto (""); // { dg-error {expected '\(' before 'goto'} }
|
||
|
+
|
||
|
+// There are many other things wrong with this code, so:
|
||
|
+// { dg-excess-errors "" }
|
||
|
diff --git a/gcc/testsuite/gcc.dg/asm-qual-3.c b/gcc/testsuite/gcc.dg/asm-qual-3.c
|
||
|
new file mode 100644
|
||
|
index 0000000..f85d8bf
|
||
|
--- /dev/null
|
||
|
+++ b/gcc/testsuite/gcc.dg/asm-qual-3.c
|
||
|
@@ -0,0 +1,9 @@
|
||
|
+/* Test that asm-qualifiers are not allowed on toplevel asm. */
|
||
|
+/* { dg-do compile } */
|
||
|
+/* { dg-options "-std=gnu99" } */
|
||
|
+
|
||
|
+asm const (""); /* { dg-error {expected '\(' before 'const'} } */
|
||
|
+asm volatile (""); /* { dg-error {expected '\(' before 'volatile'} } */
|
||
|
+asm restrict (""); /* { dg-error {expected '\(' before 'restrict'} } */
|
||
|
+asm inline (""); /* { dg-error {expected '\(' before 'inline'} } */
|
||
|
+asm goto (""); /* { dg-error {expected '\(' before 'goto'} } */
|