aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@gcc.gnu.org>2002-02-11 10:52:20 -0500
committerJason Merrill <jason@gcc.gnu.org>2002-02-11 10:52:20 -0500
commite6b9638bffefdbb60bf261626d2335848de301c4 (patch)
treeb634d429e088a0ccefa6b3c7358a84f2106abf2e /gcc
parentd6b2c474747305341ffe3f4c6fdc4f1fee4a47d1 (diff)
downloadgcc-e6b9638bffefdbb60bf261626d2335848de301c4.zip
gcc-e6b9638bffefdbb60bf261626d2335848de301c4.tar.gz
gcc-e6b9638bffefdbb60bf261626d2335848de301c4.tar.bz2
parse.y (reserved_declspecs): Don't handle attributes.
* parse.y (reserved_declspecs): Don't handle attributes. (reserved_typespecquals): Handle them here. * Make-lang.in (parse.c): Adjust expected conflicts. From-SVN: r49678
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/Make-lang.in2
-rw-r--r--gcc/cp/parse.y8
-rw-r--r--gcc/testsuite/g++.dg/ext/attrib4.C31
4 files changed, 44 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 25bf9d9..f6c2a54 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2002-02-11 Jason Merrill <jason@redhat.com>
+
+ * parse.y (reserved_declspecs): Don't handle attributes.
+ (reserved_typespecquals): Handle them here.
+ * Make-lang.in (parse.c): Adjust expected conflicts.
+
2002-02-08 Jakub Jelinek <jakub@redhat.com>
* parse.y (primary, primary_no_id): Use compstmt_or_stmtexpr
@@ -1603,8 +1609,8 @@ Fri Sep 21 08:16:19 2001 J"orn Rennecke <amylaar@redhat.com>
2001-09-15 Gabriel Dos Reis <gdr@merlin.codesourcery.com>
- * Make-lang.in (cp/error.o): Depend on real.h
- * error.c: #include "real.h"
+ * Make-lang.in (cp/error.o): Depend on real.h
+ * error.c: #include "real.h"
2001-09-15 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in
index 976559a..f8d023a 100644
--- a/gcc/cp/Make-lang.in
+++ b/gcc/cp/Make-lang.in
@@ -120,7 +120,7 @@ $(srcdir)/cp/cfns.h: $(srcdir)/cp/cfns.gperf
$(srcdir)/cp/parse.h: $(srcdir)/cp/parse.c
$(srcdir)/cp/parse.c: $(srcdir)/cp/parse.y
- @echo "Expect 31 shift/reduce conflicts and 58 reduce/reduce conflicts."
+ @echo "Expect 33 shift/reduce conflicts and 58 reduce/reduce conflicts."
cd $(srcdir)/cp && \
if $(BISON) $(BISONFLAGS) -d -o p$$$$.c parse.y; then \
grep '^#define[ ]*YYEMPTY' p$$$$.c >> p$$$$.h ; \
diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y
index 7faeaba..54a6823 100644
--- a/gcc/cp/parse.y
+++ b/gcc/cp/parse.y
@@ -1895,10 +1895,6 @@ reserved_declspecs:
warning ("`%s' is not at beginning of declaration",
IDENTIFIER_POINTER ($2));
$$ = tree_cons (NULL_TREE, $2, $$); }
- | reserved_declspecs attributes
- { $$ = tree_cons ($2, NULL_TREE, $1); }
- | attributes
- { $$ = tree_cons ($1, NULL_TREE, NULL_TREE); }
;
/* List of just storage classes and type modifiers.
@@ -1966,6 +1962,10 @@ reserved_typespecquals:
{ $$ = build_tree_list (NULL_TREE, $1.t); }
| reserved_typespecquals typespecqual_reserved
{ $$ = tree_cons (NULL_TREE, $2.t, $1); }
+ | reserved_typespecquals attributes
+ { $$ = tree_cons ($2, NULL_TREE, $1); }
+ | attributes %prec EMPTY
+ { $$ = tree_cons ($1, NULL_TREE, NULL_TREE); }
;
/* A typespec (but not a type qualifier).
diff --git a/gcc/testsuite/g++.dg/ext/attrib4.C b/gcc/testsuite/g++.dg/ext/attrib4.C
new file mode 100644
index 0000000..68cc741
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attrib4.C
@@ -0,0 +1,31 @@
+// Test for syntax support of various attribute permutations.
+
+int
+__attribute__((noreturn))
+__attribute__((unused))
+one(void); // OK
+
+__attribute__((noreturn))
+__attribute__((unused))
+int
+two(void); // OK
+
+int
+__attribute__((unused))
+three (void)
+__attribute__((noreturn)); // OK
+
+__attribute__((unused))
+int
+four (void)
+__attribute__((noreturn)); // OK
+
+int
+five(void)
+__attribute__((noreturn))
+__attribute__((unused)); // OK
+
+__attribute__((noreturn))
+int
+__attribute__((unused)) // parse error before '__attribute__' in C++
+six (void); // OK in C