Commit ba9e6dd5 by Nathan Froyd Committed by Nathan Froyd

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
parent 4ba67a06
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> 2011-01-26 Jakub Jelinek <jakub@redhat.com>
PR c/47473 PR c/47473
......
...@@ -9653,4 +9653,42 @@ keyword_is_storage_class_specifier (enum rid keyword) ...@@ -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" #include "gt-c-family-c-common.h"
...@@ -741,6 +741,7 @@ extern bool float_const_decimal64_p (void); ...@@ -741,6 +741,7 @@ extern bool float_const_decimal64_p (void);
extern bool keyword_begins_type_specifier (enum rid); extern bool keyword_begins_type_specifier (enum rid);
extern bool keyword_is_storage_class_specifier (enum rid); extern bool keyword_is_storage_class_specifier (enum rid);
extern bool keyword_is_type_qualifier (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_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) #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> 2011-01-31 Jakub Jelinek <jakub@redhat.com>
PR c++/47416 PR c++/47416
......
...@@ -16998,18 +16998,15 @@ cp_parser_class_specifier (cp_parser* parser) ...@@ -16998,18 +16998,15 @@ cp_parser_class_specifier (cp_parser* parser)
class Z { } class Z { }
static const <type> var = ...; */ static const <type> var = ...; */
case CPP_KEYWORD: case CPP_KEYWORD:
if (keyword_is_storage_class_specifier (token->keyword) if (keyword_is_decl_specifier (token->keyword))
|| keyword_is_type_qualifier (token->keyword))
{ {
cp_token *lookahead = cp_lexer_peek_nth_token (parser->lexer, 2); cp_token *lookahead = cp_lexer_peek_nth_token (parser->lexer, 2);
if (lookahead->type == CPP_KEYWORD /* Handling user-defined types here would be nice, but very
&& !keyword_begins_type_specifier (lookahead->keyword)) tricky. */
want_semicolon = false; want_semicolon
else if (lookahead->type == CPP_NAME) = (lookahead->type == CPP_KEYWORD
/* Handling user-defined types here would be nice, but && keyword_begins_type_specifier (lookahead->keyword));
very tricky. */
want_semicolon = false;
} }
break; break;
default: 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> 2011-02-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/29571 PR c++/29571
......
...@@ -62,6 +62,48 @@ autotest (void) ...@@ -62,6 +62,48 @@ autotest (void)
return ok10.a; 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 struct E1
{ {
int a; int a;
...@@ -196,6 +238,13 @@ class E17 ...@@ -196,6 +238,13 @@ class E17
mutable int i; mutable int i;
} // { dg-error "after class definition" } } // { 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. */ /* This was the original test from the PR. */
class C0 class C0
......
// 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);
// PR c++/46890
// { dg-do compile }
struct MdatResource {
const char *mdatAlloc;
} const *_resource;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment