Commit 97d24516 by Joseph Myers Committed by Joseph Myers

re PR c/166 (C syntax problem in gcc)

	* c-parse.in (parm_declarator): Split into
	parm_declarator_starttypename and parm_declarator_nostarttypename.
	(parm_declarator_starttypename, parm_declarator_nostarttypename):
	New.  Allow parenthesised sub-declarators which don't begin with a
	TYPENAME.  Fixes PR c/166.

testsuite:
	* gcc.c-torture/compile/20010114-1.x: Remove.

From-SVN: r42315
parent e48d3d00
2001-05-19 Joseph S. Myers <jsm28@cam.ac.uk>
* c-parse.in (parm_declarator): Split into
parm_declarator_starttypename and parm_declarator_nostarttypename.
(parm_declarator_starttypename, parm_declarator_nostarttypename):
New. Allow parenthesised sub-declarators which don't begin with a
TYPENAME. Fixes PR c/166.
2001-05-19 Mark Mitchell <mark@codesourcery.com> 2001-05-19 Mark Mitchell <mark@codesourcery.com>
* defaults.h (TARGET_ALLOWS_PROFILING_WITHOUT_FRAME_POINTER): New * defaults.h (TARGET_ALLOWS_PROFILING_WITHOUT_FRAME_POINTER): New
......
...@@ -197,6 +197,7 @@ end ifc ...@@ -197,6 +197,7 @@ end ifc
%type <ttype> declarator %type <ttype> declarator
%type <ttype> notype_declarator after_type_declarator %type <ttype> notype_declarator after_type_declarator
%type <ttype> parm_declarator %type <ttype> parm_declarator
%type <ttype> parm_declarator_starttypename parm_declarator_nostarttypename
%type <ttype> structsp_attr structsp_nonattr %type <ttype> structsp_attr structsp_nonattr
%type <ttype> component_decl_list component_decl_list2 %type <ttype> component_decl_list component_decl_list2
...@@ -1683,29 +1684,56 @@ end ifobjc ...@@ -1683,29 +1684,56 @@ end ifobjc
in addition to notype_declarator. This is like after_type_declarator in addition to notype_declarator. This is like after_type_declarator
but does not allow a typedef name in parentheses as an identifier but does not allow a typedef name in parentheses as an identifier
(because it would conflict with a function with that typedef as arg). */ (because it would conflict with a function with that typedef as arg). */
parm_declarator: parm_declarator:
parm_declarator '(' parmlist_or_identifiers %prec '.' parm_declarator_starttypename
| parm_declarator_nostarttypename
;
parm_declarator_starttypename:
parm_declarator_starttypename '(' parmlist_or_identifiers %prec '.'
{ $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); }
/* | parm_declarator '(' error ')' %prec '.' /* | parm_declarator_starttypename '(' error ')' %prec '.'
{ $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE);
poplevel (0, 0, 0); } */ poplevel (0, 0, 0); } */
ifc ifc
| parm_declarator '[' '*' ']' %prec '.' | parm_declarator_starttypename '[' '*' ']' %prec '.'
{ $$ = build_nt (ARRAY_REF, $1, NULL_TREE); { $$ = build_nt (ARRAY_REF, $1, NULL_TREE);
if (! flag_isoc99) if (! flag_isoc99)
error ("`[*]' in parameter declaration only allowed in ISO C 99"); error ("`[*]' in parameter declaration only allowed in ISO C 99");
} }
end ifc end ifc
| parm_declarator '[' expr ']' %prec '.' | parm_declarator_starttypename '[' expr ']' %prec '.'
{ $$ = build_nt (ARRAY_REF, $1, $3); } { $$ = build_nt (ARRAY_REF, $1, $3); }
| parm_declarator '[' ']' %prec '.' | parm_declarator_starttypename '[' ']' %prec '.'
{ $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); }
| '*' maybe_type_quals_setattrs parm_declarator %prec UNARY
{ $$ = make_pointer_declarator ($2, $3); }
| TYPENAME | TYPENAME
; ;
parm_declarator_nostarttypename:
parm_declarator_nostarttypename '(' parmlist_or_identifiers %prec '.'
{ $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); }
/* | parm_declarator_nostarttypename '(' error ')' %prec '.'
{ $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE);
poplevel (0, 0, 0); } */
ifc
| parm_declarator_nostarttypename '[' '*' ']' %prec '.'
{ $$ = build_nt (ARRAY_REF, $1, NULL_TREE);
if (! flag_isoc99)
error ("`[*]' in parameter declaration only allowed in ISO C 99");
}
end ifc
| parm_declarator_nostarttypename '[' expr ']' %prec '.'
{ $$ = build_nt (ARRAY_REF, $1, $3); }
| parm_declarator_nostarttypename '[' ']' %prec '.'
{ $$ = build_nt (ARRAY_REF, $1, NULL_TREE); }
| '*' maybe_type_quals_setattrs parm_declarator_starttypename %prec UNARY
{ $$ = make_pointer_declarator ($2, $3); }
| '*' maybe_type_quals_setattrs parm_declarator_nostarttypename %prec UNARY
{ $$ = make_pointer_declarator ($2, $3); }
| '(' maybe_setattrs parm_declarator_nostarttypename ')'
{ $$ = $3; }
;
/* A declarator allowed whether or not there has been /* A declarator allowed whether or not there has been
an explicit typespec. These cannot redeclare a typedef-name. */ an explicit typespec. These cannot redeclare a typedef-name. */
......
2001-05-19 Joseph S. Myers <jsm28@cam.ac.uk>
* gcc.c-torture/compile/20010114-1.x: Remove.
2001-05-18 Stan Shebs <shebs@apple.com> 2001-05-18 Stan Shebs <shebs@apple.com>
* gcc.c-torture/compile/20010518-1.c: New test. * gcc.c-torture/compile/20010518-1.c: New test.
......
set torture_compile_xfail "*-*-*"
return 0
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