diff options
author | Joseph Myers <jsm28@cam.ac.uk> | 2001-05-19 21:19:24 +0100 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2001-05-19 21:19:24 +0100 |
commit | 97d24516096d049cb068a9c0ee55c87460735d2a (patch) | |
tree | 0ede5348cf61c0dd094af56c55f4b7fb181e2291 /gcc | |
parent | e48d3d009f208ae8c1703bef68150f2d6c33a3f8 (diff) | |
download | gcc-97d24516096d049cb068a9c0ee55c87460735d2a.zip gcc-97d24516096d049cb068a9c0ee55c87460735d2a.tar.gz gcc-97d24516096d049cb068a9c0ee55c87460735d2a.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/c-parse.in | 44 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/20010114-1.x | 2 |
4 files changed, 48 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 64a0c14..b55e0e7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +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> * defaults.h (TARGET_ALLOWS_PROFILING_WITHOUT_FRAME_POINTER): New diff --git a/gcc/c-parse.in b/gcc/c-parse.in index 3eda45c..3a1c17e 100644 --- a/gcc/c-parse.in +++ b/gcc/c-parse.in @@ -197,6 +197,7 @@ end ifc %type <ttype> declarator %type <ttype> notype_declarator after_type_declarator %type <ttype> parm_declarator +%type <ttype> parm_declarator_starttypename parm_declarator_nostarttypename %type <ttype> structsp_attr structsp_nonattr %type <ttype> component_decl_list component_decl_list2 @@ -1683,29 +1684,56 @@ end ifobjc in addition to notype_declarator. This is like after_type_declarator but does not allow a typedef name in parentheses as an identifier (because it would conflict with a function with that typedef as arg). */ - 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); } -/* | parm_declarator '(' error ')' %prec '.' +/* | parm_declarator_starttypename '(' error ')' %prec '.' { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); poplevel (0, 0, 0); } */ ifc - | parm_declarator '[' '*' ']' %prec '.' + | parm_declarator_starttypename '[' '*' ']' %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 '[' expr ']' %prec '.' + | parm_declarator_starttypename '[' expr ']' %prec '.' { $$ = build_nt (ARRAY_REF, $1, $3); } - | parm_declarator '[' ']' %prec '.' + | parm_declarator_starttypename '[' ']' %prec '.' { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } - | '*' maybe_type_quals_setattrs parm_declarator %prec UNARY - { $$ = make_pointer_declarator ($2, $3); } | 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 an explicit typespec. These cannot redeclare a typedef-name. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fabd9e6..ac40b14 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +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> * gcc.c-torture/compile/20010518-1.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/20010114-1.x b/gcc/testsuite/gcc.c-torture/compile/20010114-1.x deleted file mode 100644 index f41cdc2..0000000 --- a/gcc/testsuite/gcc.c-torture/compile/20010114-1.x +++ /dev/null @@ -1,2 +0,0 @@ -set torture_compile_xfail "*-*-*" -return 0 |