[multiple changes]
2002-10-21 Matthias Klose <doko@debian.org> * Backport, without whitespace change: 2002-06-19 Akim Demaille <akim@epita.fr> * parse.y (TYPENAME): Rename as tTYPENAME to avoid the clash with decl.h's TYPENAME. * spew.c, lex.c: Adjust. * parse.y (explicit_instantiation): Add empty action to override the default $$ = $1 where it introduces a type clash. From-SVN: r58372
This commit is contained in:
parent
d3dc327399
commit
9a68409d71
|
@ -1,3 +1,13 @@
|
|||
2002-10-21 Matthias Klose <doko@debian.org>
|
||||
|
||||
* Backport, without whitespace change:
|
||||
2002-06-19 Akim Demaille <akim@epita.fr>
|
||||
* parse.y (TYPENAME): Rename as tTYPENAME to avoid the clash with
|
||||
decl.h's TYPENAME.
|
||||
* spew.c, lex.c: Adjust.
|
||||
* parse.y (explicit_instantiation): Add empty action to override
|
||||
the default $$ = $1 where it introduces a type clash.
|
||||
|
||||
2002-10-21 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/8218
|
||||
|
|
13
gcc/cp/lex.c
13
gcc/cp/lex.c
|
@ -90,10 +90,11 @@ extern YYSTYPE yylval; /* the semantic value of the */
|
|||
int warn_traditional = 0;
|
||||
int flag_digraphs = 1;
|
||||
|
||||
/* the declaration found for the last IDENTIFIER token read in.
|
||||
yylex must look this up to detect typedefs, which get token type TYPENAME,
|
||||
so it is left around in case the identifier is not a typedef but is
|
||||
used in a context which makes it a reference to a variable. */
|
||||
/* the declaration found for the last IDENTIFIER token read in. yylex
|
||||
must look this up to detect typedefs, which get token type
|
||||
tTYPENAME, so it is left around in case the identifier is not a
|
||||
typedef but is used in a context which makes it a reference to a
|
||||
variable. */
|
||||
tree lastiddecl;
|
||||
|
||||
/* Array for holding counts of the numbers of tokens seen. */
|
||||
|
@ -739,7 +740,7 @@ yyprint (file, yychar, yylval)
|
|||
switch (yychar)
|
||||
{
|
||||
case IDENTIFIER:
|
||||
case TYPENAME:
|
||||
case tTYPENAME:
|
||||
case TYPESPEC:
|
||||
case PTYPENAME:
|
||||
case PFUNCNAME:
|
||||
|
@ -977,7 +978,7 @@ check_for_missing_semicolon (type)
|
|||
if ((yychar > 255
|
||||
&& yychar != SCSPEC
|
||||
&& yychar != IDENTIFIER
|
||||
&& yychar != TYPENAME
|
||||
&& yychar != tTYPENAME
|
||||
&& yychar != CV_QUALIFIER
|
||||
&& yychar != SELFNAME)
|
||||
|| yychar == 0 /* EOF */)
|
||||
|
|
|
@ -253,7 +253,7 @@ cp_parse_init ()
|
|||
/* All identifiers that are declared typedefs in the current block.
|
||||
In some contexts, they are treated just like IDENTIFIER,
|
||||
but they can also serve as typespecs in declarations. */
|
||||
%token TYPENAME
|
||||
%token tTYPENAME
|
||||
%token SELFNAME
|
||||
|
||||
/* A template function. */
|
||||
|
@ -315,7 +315,7 @@ cp_parse_init ()
|
|||
%nonassoc IF
|
||||
%nonassoc ELSE
|
||||
|
||||
%left IDENTIFIER PFUNCNAME TYPENAME SELFNAME PTYPENAME SCSPEC TYPESPEC CV_QUALIFIER ENUM AGGR ELLIPSIS TYPEOF SIGOF OPERATOR NSNAME TYPENAME_KEYWORD ATTRIBUTE
|
||||
%left IDENTIFIER PFUNCNAME tTYPENAME SELFNAME PTYPENAME SCSPEC TYPESPEC CV_QUALIFIER ENUM AGGR ELLIPSIS TYPEOF SIGOF OPERATOR NSNAME TYPENAME_KEYWORD ATTRIBUTE
|
||||
|
||||
%left '{' ',' ';'
|
||||
|
||||
|
@ -345,7 +345,7 @@ cp_parse_init ()
|
|||
|
||||
%type <code> unop
|
||||
|
||||
%type <ttype> identifier IDENTIFIER TYPENAME CONSTANT expr nonnull_exprlist
|
||||
%type <ttype> identifier IDENTIFIER tTYPENAME CONSTANT expr nonnull_exprlist
|
||||
%type <ttype> PFUNCNAME maybe_identifier
|
||||
%type <ttype> paren_expr_or_null nontrivial_exprlist SELFNAME
|
||||
%type <ttype> expr_no_commas expr_no_comma_rangle
|
||||
|
@ -994,7 +994,7 @@ member_init:
|
|||
|
||||
identifier:
|
||||
IDENTIFIER
|
||||
| TYPENAME
|
||||
| tTYPENAME
|
||||
| SELFNAME
|
||||
| PTYPENAME
|
||||
| NSNAME
|
||||
|
@ -1031,17 +1031,21 @@ explicit_instantiation:
|
|||
{ do_type_instantiation ($4.t, $1, 1);
|
||||
yyungetc (';', 1); }
|
||||
end_explicit_instantiation
|
||||
{}
|
||||
| SCSPEC TEMPLATE begin_explicit_instantiation typed_declspecs
|
||||
declarator
|
||||
{ tree specs = strip_attrs ($4.t);
|
||||
do_decl_instantiation (specs, $5, $1); }
|
||||
end_explicit_instantiation
|
||||
{}
|
||||
| SCSPEC TEMPLATE begin_explicit_instantiation notype_declarator
|
||||
{ do_decl_instantiation (NULL_TREE, $4, $1); }
|
||||
end_explicit_instantiation
|
||||
{}
|
||||
| SCSPEC TEMPLATE begin_explicit_instantiation constructor_declarator
|
||||
{ do_decl_instantiation (NULL_TREE, $4, $1); }
|
||||
end_explicit_instantiation
|
||||
{}
|
||||
;
|
||||
|
||||
begin_explicit_instantiation:
|
||||
|
@ -1060,7 +1064,7 @@ template_type:
|
|||
PTYPENAME '<' template_arg_list_opt template_close_bracket
|
||||
.finish_template_type
|
||||
{ $$ = $5; }
|
||||
| TYPENAME '<' template_arg_list_opt template_close_bracket
|
||||
| tTYPENAME '<' template_arg_list_opt template_close_bracket
|
||||
.finish_template_type
|
||||
{ $$ = $5; }
|
||||
| self_template_type
|
||||
|
@ -1532,7 +1536,7 @@ object_template_id:
|
|||
|
||||
unqualified_id:
|
||||
notype_unqualified_id
|
||||
| TYPENAME
|
||||
| tTYPENAME
|
||||
| SELFNAME
|
||||
;
|
||||
|
||||
|
@ -2767,7 +2771,7 @@ after_type_component_declarator0:
|
|||
after_type_declarator maybeasm maybe_attribute maybe_init
|
||||
{ $$ = parse_field0 ($1, $<ftype>0.t, $<ftype>0.lookups,
|
||||
$3, $2, $4); }
|
||||
| TYPENAME ':' expr_no_commas maybe_attribute
|
||||
| tTYPENAME ':' expr_no_commas maybe_attribute
|
||||
{ $$ = parse_bitfield0 ($1, $<ftype>0.t, $<ftype>0.lookups,
|
||||
$4, $3); }
|
||||
;
|
||||
|
@ -2790,7 +2794,7 @@ notype_component_declarator0:
|
|||
after_type_component_declarator:
|
||||
after_type_declarator maybeasm maybe_attribute maybe_init
|
||||
{ $$ = parse_field ($1, $3, $2, $4); }
|
||||
| TYPENAME ':' expr_no_commas maybe_attribute
|
||||
| tTYPENAME ':' expr_no_commas maybe_attribute
|
||||
{ $$ = parse_bitfield ($1, $4, $3); }
|
||||
;
|
||||
|
||||
|
@ -3062,7 +3066,7 @@ functional_cast:
|
|||
;
|
||||
|
||||
type_name:
|
||||
TYPENAME
|
||||
tTYPENAME
|
||||
| SELFNAME
|
||||
| template_type %prec EMPTY
|
||||
;
|
||||
|
@ -3086,7 +3090,7 @@ nested_name_specifier:
|
|||
/* Why the @#$%^& do type_name and notype_identifier need to be expanded
|
||||
inline here?!? (jason) */
|
||||
nested_name_specifier_1:
|
||||
TYPENAME SCOPE
|
||||
tTYPENAME SCOPE
|
||||
{
|
||||
if (TREE_CODE ($1) == IDENTIFIER_NODE)
|
||||
{
|
||||
|
@ -3172,7 +3176,7 @@ typename_sub1:
|
|||
/* This needs to return a TYPE_DECL for simple names so that we don't
|
||||
forget what name was used. */
|
||||
typename_sub2:
|
||||
TYPENAME SCOPE
|
||||
tTYPENAME SCOPE
|
||||
{
|
||||
if (TREE_CODE ($1) != TYPE_DECL)
|
||||
$$ = lastiddecl;
|
||||
|
@ -3610,7 +3614,7 @@ label_colon:
|
|||
{ finish_label_stmt ($1); }
|
||||
| PTYPENAME ':'
|
||||
{ finish_label_stmt ($1); }
|
||||
| TYPENAME ':'
|
||||
| tTYPENAME ':'
|
||||
{ finish_label_stmt ($1); }
|
||||
| SELFNAME ':'
|
||||
{ finish_label_stmt ($1); }
|
||||
|
|
|
@ -141,10 +141,11 @@ static enum cpp_ttype last_token;
|
|||
static tree last_token_id;
|
||||
|
||||
/* From lex.c: */
|
||||
/* the declaration found for the last IDENTIFIER token read in.
|
||||
yylex must look this up to detect typedefs, which get token type TYPENAME,
|
||||
so it is left around in case the identifier is not a typedef but is
|
||||
used in a context which makes it a reference to a variable. */
|
||||
/* the declaration found for the last IDENTIFIER token read in. yylex
|
||||
must look this up to detect typedefs, which get token type
|
||||
tTYPENAME, so it is left around in case the identifier is not a
|
||||
typedef but is used in a context which makes it a reference to a
|
||||
variable. */
|
||||
extern tree lastiddecl; /* let our brains leak out here too */
|
||||
extern int yychar; /* the lookahead symbol */
|
||||
extern YYSTYPE yylval; /* the semantic value of the */
|
||||
|
@ -628,11 +629,11 @@ identifier_type (decl)
|
|||
if (t && t == decl)
|
||||
return SELFNAME;
|
||||
|
||||
return TYPENAME;
|
||||
return tTYPENAME;
|
||||
}
|
||||
|
||||
/* token[0] == AGGR (struct/union/enum)
|
||||
Thus, token[1] is either a TYPENAME or a TYPENAME_DEFN.
|
||||
Thus, token[1] is either a tTYPENAME or a TYPENAME_DEFN.
|
||||
If token[2] == '{' or ':' then it's TYPENAME_DEFN.
|
||||
It's also a definition if it's a forward declaration (as in 'struct Foo;')
|
||||
which we can tell if token[2] == ';' *and* token[-1] != FRIEND or NEW. */
|
||||
|
@ -644,7 +645,7 @@ do_aggr ()
|
|||
|
||||
scan_tokens (2);
|
||||
yc1 = nth_token (1)->yychar;
|
||||
if (yc1 != TYPENAME && yc1 != IDENTIFIER && yc1 != PTYPENAME)
|
||||
if (yc1 != tTYPENAME && yc1 != IDENTIFIER && yc1 != PTYPENAME)
|
||||
return;
|
||||
yc2 = nth_token (2)->yychar;
|
||||
if (yc2 == ';')
|
||||
|
@ -659,7 +660,7 @@ do_aggr ()
|
|||
|
||||
switch (yc1)
|
||||
{
|
||||
case TYPENAME:
|
||||
case tTYPENAME:
|
||||
nth_token (1)->yychar = TYPENAME_DEFN;
|
||||
break;
|
||||
case PTYPENAME:
|
||||
|
@ -757,7 +758,7 @@ yylex ()
|
|||
break;
|
||||
}
|
||||
case IDENTIFIER_DEFN:
|
||||
case TYPENAME:
|
||||
case tTYPENAME:
|
||||
case TYPENAME_DEFN:
|
||||
case PTYPENAME:
|
||||
case PTYPENAME_DEFN:
|
||||
|
@ -897,7 +898,7 @@ frob_id (yyc, peek, idp)
|
|||
yyc = identifier_type (trrr);
|
||||
switch(yyc)
|
||||
{
|
||||
case TYPENAME:
|
||||
case tTYPENAME:
|
||||
case SELFNAME:
|
||||
case NSNAME:
|
||||
case PTYPENAME:
|
||||
|
@ -1448,7 +1449,7 @@ debug_yychar (yy)
|
|||
{
|
||||
if (yy<256)
|
||||
fprintf (stderr, "->%d < %c >\n", lineno, yy);
|
||||
else if (yy == IDENTIFIER || yy == TYPENAME)
|
||||
else if (yy == IDENTIFIER || yy == tTYPENAME)
|
||||
{
|
||||
const char *id;
|
||||
if (TREE_CODE (yylval.ttype) == IDENTIFIER_NODE)
|
||||
|
|
Loading…
Reference in New Issue