+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
}
}
+/* 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"
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)
+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
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:
+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
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;
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
--- /dev/null
+// 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);
--- /dev/null
+// PR c++/46890
+// { dg-do compile }
+
+struct MdatResource {
+const char *mdatAlloc;
+} const *_resource;