c-parse.in (unary_expr): Move VA_ARG from here ...
authorNathan Sidwell <nathan@codesourcery.com>
Fri, 24 Nov 2000 10:30:46 +0000 (10:30 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 24 Nov 2000 10:30:46 +0000 (10:30 +0000)
        * c-parse.in (unary_expr): Move VA_ARG from here ...
        (primary): ... to here.
cp:
        * parse.y (unary_expr): Move VA_ARG from here ...
        (primary): ... to here.

testsuite:
        * g++.old-deja/g++.other/vaarg4.C: New test.
        * gcc.c-torture/compile/20001123-1.c: New test.

From-SVN: r37703

gcc/ChangeLog
gcc/c-parse.in
gcc/cp/ChangeLog
gcc/cp/parse.y
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.other/vaarg4.C [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/20001123-1.c [new file with mode: 0644]

index df496a0fe73f5aaf4ffd011ac07d105c74b33e86..650c5dcff092b1442297f472e42afc974a498381 100644 (file)
@@ -1,3 +1,8 @@
+2000-11-24  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * c-parse.in (unary_expr): Move VA_ARG from here ...
+       (primary): ... to here.
+
 2000-11-23  Graham Stott  <grahams@redhat.com>
 
        * expr.c (store_constructor): If a field is non addressable and
index 5943fa4024a0ae72c0a7a1542248e7be7a40a982..d73ba4bf8da8209503738e4560a6cf65e8e08ba0 100644 (file)
@@ -514,8 +514,6 @@ unary_expr:
                { $$ = build_unary_op (REALPART_EXPR, $2, 0); }
        | IMAGPART cast_expr %prec UNARY
                { $$ = build_unary_op (IMAGPART_EXPR, $2, 0); }
-       | VA_ARG '(' expr_no_commas ',' typename ')'
-               { $$ = build_va_arg ($3, groktypename ($5)); }
        ;
 
 sizeof:
@@ -688,6 +686,8 @@ primary:
                }
        | primary '(' exprlist ')'   %prec '.'
                { $$ = build_function_call ($1, $3); }
+       | VA_ARG '(' expr_no_commas ',' typename ')'
+               { $$ = build_va_arg ($3, groktypename ($5)); }
        | primary '[' expr ']'   %prec '.'
                { $$ = build_array_ref ($1, $3); }
        | primary '.' identifier
index b3a5dfd2b2dc358932bd7778a43906c4cb1a5fce..9bbf5b92e4a90a71fde043905daf81438ac0ca68 100644 (file)
@@ -1,3 +1,8 @@
+2000-11-24  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * parse.y (unary_expr): Move VA_ARG from here ...
+       (primary): ... to here.
+
 2000-11-24  Nathan Sidwell  <nathan@codesourcery.com>
 
        * semantics.c (finish_id_expr): If type is error_mark, return
index d55f1b9f058f5106e108d60ebf62a78e837a608a..9e32911058f9d3538e019f414202935ef5465325 100644 (file)
@@ -1252,9 +1252,6 @@ unary_expr:
                { $$ = build_x_unary_op (REALPART_EXPR, $2); }
        | IMAGPART cast_expr %prec UNARY
                { $$ = build_x_unary_op (IMAGPART_EXPR, $2); }
-       | VA_ARG '(' expr_no_commas ',' type_id ')'
-               { $$ = build_x_va_arg ($3, groktypename ($5.t));
-                 check_for_new_type ("__builtin_va_arg", $5); }
        ;
 
 new_placement:
@@ -1562,6 +1559,9 @@ primary:
                { $$ = finish_call_expr ($1, $3, 0); }
        | primary LEFT_RIGHT
                { $$ = finish_call_expr ($1, NULL_TREE, 0); }
+       | VA_ARG '(' expr_no_commas ',' type_id ')'
+               { $$ = build_x_va_arg ($3, groktypename ($5.t));
+                 check_for_new_type ("__builtin_va_arg", $5); }
        | primary '[' expr ']'
                { $$ = grok_array_decl ($$, $3); }
        | primary PLUSPLUS
index f4be5667a4280d832db58ca6e7029fbe24628c9d..12ded3d5481e3cb51214e967bd116cacd3debf01 100644 (file)
@@ -1,3 +1,8 @@
+2000-11-24  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old-deja/g++.other/vaarg4.C: New test.
+       * gcc.c-torture/compile/20001123-1.c: New test.
+
 2000-11-24  Nathan Sidwell  <nathan@codesourcery.com>
 
        * g++.other/crash24.C: Adjust and remove XFAIL.
diff --git a/gcc/testsuite/g++.old-deja/g++.other/vaarg4.C b/gcc/testsuite/g++.old-deja/g++.other/vaarg4.C
new file mode 100644 (file)
index 0000000..3b312ab
--- /dev/null
@@ -0,0 +1,15 @@
+// Build don't link:
+
+// Bug 845. We were treating __builtin_va_arg as a unary expr, not a primary,
+// and hence getting parse errors.
+
+typedef __builtin_va_list __gnuc_va_list;
+typedef __gnuc_va_list va_list;
+
+struct X { int y; };
+
+void func(va_list va)
+{
+  char* a = __builtin_va_arg(va, char**)[0];
+  int b = __builtin_va_arg(va, X*)->y;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/20001123-1.c b/gcc/testsuite/gcc.c-torture/compile/20001123-1.c
new file mode 100644 (file)
index 0000000..5953448
--- /dev/null
@@ -0,0 +1,11 @@
+
+typedef __builtin_va_list __gnuc_va_list;
+typedef __gnuc_va_list va_list;
+
+struct X { int y; };
+
+void func(va_list va)
+{
+  char* a = __builtin_va_arg(va, char**)[0];
+  int b = __builtin_va_arg(va, struct X*)->y;
+}