aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Froyd <froydnj@codesourcery.com>2011-02-03 17:16:17 +0000
committerNathan Froyd <froydnj@gcc.gnu.org>2011-02-03 17:16:17 +0000
commitba9e6dd56cd07311fce012f4cfe2c74007d7ffcd (patch)
tree3037e42c4d4fe6047d9ad5d3c4f084f3e0c0dc39 /gcc
parent4ba67a06590810f6ecbe55cc69c94634fc71ddbb (diff)
downloadgcc-ba9e6dd56cd07311fce012f4cfe2c74007d7ffcd.zip
gcc-ba9e6dd56cd07311fce012f4cfe2c74007d7ffcd.tar.gz
gcc-ba9e6dd56cd07311fce012f4cfe2c74007d7ffcd.tar.bz2
re PR c++/46890 (Failed to compile scummvm's player_v4a.cpp)
gcc/c-family/ PR c++/46890 * c-common.h (keyword_is_decl_specifier): Declare. * c-common.c (keyword_is_decl_specifier): Define. (keyword_is_function_specifier): New function. gcc/cp/ PR c++/46890 * parser.c (cp_parser_class_specifier): Fix setting of want_semicolon. gcc/testsuite/ PR c++/46890 * g++.dg/parser/semicolon3.C: Adjust. * g++.dg/parser/semicolon4.C: New testcase. * g++.dg/pr46890.C: New testcase. Co-Authored-By: Jakub Jelinek <jakub@redhat.com> From-SVN: r169797
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/ChangeLog7
-rw-r--r--gcc/c-family/c-common.c38
-rw-r--r--gcc/c-family/c-common.h1
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c15
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/parse/semicolon3.C49
-rw-r--r--gcc/testsuite/g++.dg/parse/semicolon4.C37
-rw-r--r--gcc/testsuite/g++.dg/pr46890.C6
9 files changed, 158 insertions, 9 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index d18ba20..ec0acab 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,10 @@
+2011-02-03 Nathan Froyd <froydnj@codesourcery.com>
+
+ PR c++/46890
+ * c-common.h (keyword_is_decl_specifier): Declare.
+ * c-common.c (keyword_is_decl_specifier): Define.
+ (keyword_is_function_specifier): New function.
+
2011-01-26 Jakub Jelinek <jakub@redhat.com>
PR c/47473
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 2156fa8..3e46019 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -9653,4 +9653,42 @@ keyword_is_storage_class_specifier (enum rid keyword)
}
}
+/* Return true if KEYWORD names a function-specifier [dcl.fct.spec]. */
+
+static bool
+keyword_is_function_specifier (enum rid keyword)
+{
+ switch (keyword)
+ {
+ case RID_INLINE:
+ case RID_VIRTUAL:
+ case RID_EXPLICIT:
+ return true;
+ default:
+ return false;
+ }
+}
+
+/* Return true if KEYWORD names a decl-specifier [dcl.spec] or a
+ declaration-specifier (C99 6.7). */
+
+bool
+keyword_is_decl_specifier (enum rid keyword)
+{
+ if (keyword_is_storage_class_specifier (keyword)
+ || keyword_is_type_qualifier (keyword)
+ || keyword_is_function_specifier (keyword))
+ return true;
+
+ switch (keyword)
+ {
+ case RID_TYPEDEF:
+ case RID_FRIEND:
+ case RID_CONSTEXPR:
+ return true;
+ default:
+ return false;
+ }
+}
+
#include "gt-c-family-c-common.h"
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index 05456d3..406def9 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -741,6 +741,7 @@ extern bool float_const_decimal64_p (void);
extern bool keyword_begins_type_specifier (enum rid);
extern bool keyword_is_storage_class_specifier (enum rid);
extern bool keyword_is_type_qualifier (enum rid);
+extern bool keyword_is_decl_specifier (enum rid);
#define c_sizeof(LOC, T) c_sizeof_or_alignof_type (LOC, T, true, 1)
#define c_alignof(LOC, T) c_sizeof_or_alignof_type (LOC, T, false, 1)
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 673ec6c..65edb9c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2011-02-03 Nathan Froyd <froydnj@codesourcery.com>
+
+ PR c++/46890
+ * parser.c (cp_parser_class_specifier): Fix setting of
+ want_semicolon.
+
2011-01-31 Jakub Jelinek <jakub@redhat.com>
PR c++/47416
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 2b6a752..11039b8 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -16998,18 +16998,15 @@ cp_parser_class_specifier (cp_parser* parser)
class Z { }
static const <type> var = ...; */
case CPP_KEYWORD:
- if (keyword_is_storage_class_specifier (token->keyword)
- || keyword_is_type_qualifier (token->keyword))
+ if (keyword_is_decl_specifier (token->keyword))
{
cp_token *lookahead = cp_lexer_peek_nth_token (parser->lexer, 2);
- if (lookahead->type == CPP_KEYWORD
- && !keyword_begins_type_specifier (lookahead->keyword))
- want_semicolon = false;
- else if (lookahead->type == CPP_NAME)
- /* Handling user-defined types here would be nice, but
- very tricky. */
- want_semicolon = false;
+ /* Handling user-defined types here would be nice, but very
+ tricky. */
+ want_semicolon
+ = (lookahead->type == CPP_KEYWORD
+ && keyword_begins_type_specifier (lookahead->keyword));
}
break;
default:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 361e0bc..5adb4a3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2011-02-03 Nathan Froyd <froydnj@codesourcery.com>
+ Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/46890
+ * g++.dg/parser/semicolon3.C: Adjust.
+ * g++.dg/parser/semicolon4.C: New testcase.
+ * g++.dg/pr46890.C: New testcase.
+
2011-02-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/29571
diff --git a/gcc/testsuite/g++.dg/parse/semicolon3.C b/gcc/testsuite/g++.dg/parse/semicolon3.C
index a119ef4..bc43b48 100644
--- a/gcc/testsuite/g++.dg/parse/semicolon3.C
+++ b/gcc/testsuite/g++.dg/parse/semicolon3.C
@@ -62,6 +62,48 @@ autotest (void)
return ok10.a;
}
+struct OK11
+{
+ int a;
+} // no complaints
+ const *ok11_var;
+
+struct OK12
+{
+ int a;
+} // no complaints
+ const &ok12_var = *(new OK12());
+
+struct OK13
+{
+ int a;
+} // no complaints
+ static *ok13_var;
+
+class OK14
+{
+ struct OK14sub
+ {
+ int a;
+ } // no complaints
+ static &ok14_var;
+};
+
+class OK15
+{
+ int a;
+} typedef tOK15;
+
+class OK16
+{
+ int a;
+} typedef *pOK16;
+
+class OK17
+{
+ int a;
+} typedef &rOK16;
+
struct E1
{
int a;
@@ -196,6 +238,13 @@ class E17
mutable int i;
} // { dg-error "after class definition" }
+class E18
+{
+ int a;
+} // { dg-error "after class definition" }
+
+typedef int E18int;
+
/* This was the original test from the PR. */
class C0
diff --git a/gcc/testsuite/g++.dg/parse/semicolon4.C b/gcc/testsuite/g++.dg/parse/semicolon4.C
new file mode 100644
index 0000000..adba7a8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/semicolon4.C
@@ -0,0 +1,37 @@
+// PR c++/46890
+// { dg-do compile }
+
+struct OK1
+{
+ int i;
+} const *ok1_var; // No complains
+
+struct OK2;
+extern OK2 ok2a_var;
+
+struct OK2
+{
+ int i;
+} const &ok2_var = ok2a_var; // No complains
+
+struct OK3
+{
+ int i;
+} volatile (ok3_var); // No complains
+
+struct E1
+{
+ int i;
+} const; // { dg-error "qualifiers can only be specified for objects and functions" }
+
+void foo (
+struct E2
+{ // { dg-error "types may not be defined in parameter types" }
+ int i;
+} volatile);
+
+void bar (
+struct E3
+{ // { dg-error "types may not be defined in parameter types" }
+ int i;
+} const, int);
diff --git a/gcc/testsuite/g++.dg/pr46890.C b/gcc/testsuite/g++.dg/pr46890.C
new file mode 100644
index 0000000..3ecef5a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr46890.C
@@ -0,0 +1,6 @@
+// PR c++/46890
+// { dg-do compile }
+
+struct MdatResource {
+const char *mdatAlloc;
+} const *_resource;