re PR c/166 (C syntax problem in gcc)
authorJoseph Myers <jsm28@cam.ac.uk>
Sat, 19 May 2001 20:19:24 +0000 (21:19 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Sat, 19 May 2001 20:19:24 +0000 (21:19 +0100)
* 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

gcc/ChangeLog
gcc/c-parse.in
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20010114-1.x [deleted file]

index 64a0c1457212b833836eb98c305ab4b0c4bd4ece..b55e0e7e835756df80f775bd28d4a5229e743f7b 100644 (file)
@@ -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
index 3eda45c25de454ef926bc84abd034146ce375240..3a1c17eb70872cec0de3efb7bdee5fe77136f950 100644 (file)
@@ -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.  */
 
index fabd9e6108d4070bb77d2c003cce96d5d99fe3d6..ac40b1441d2cc5428cfb73ce888929301d233fe7 100644 (file)
@@ -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 (file)
index f41cdc2..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-set torture_compile_xfail "*-*-*"
-return 0