]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/23840 (Bogus "invalid lvalue in unary '&'" diagnostic and ICE with va_arg)
authorMark Mitchell <mark@codesourcery.com>
Sun, 2 Oct 2005 21:28:50 +0000 (21:28 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sun, 2 Oct 2005 21:28:50 +0000 (21:28 +0000)
PR c++/23840
* tree.c (lvalue_p1): A VA_ARG_EXPR with class type is an lvalue,
when class rvalues are lvalues.

PR c++/23840
* g++.dg/expr/stdarg1.C: New test.

From-SVN: r104877

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/expr/stdarg1.C [new file with mode: 0644]

index f4255d628cd3c55a8fcb34189b5e632dc42d82b7..14fc98fbbea169d073cbf014323053b8fdd07509 100644 (file)
@@ -1,3 +1,9 @@
+2005-10-02  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/23840
+       * tree.c (lvalue_p1): A VA_ARG_EXPR with class type is an lvalue,
+       when class rvalues are lvalues.
+
 2005-09-28  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/16782
index 9c28f13f306ee904dd0db8eb088f98b4fbdf24c2..954a8093a9599bc53a1af91d4e145785b9d39538 100644 (file)
@@ -158,8 +158,12 @@ lvalue_p_1 (tree ref,
     case TARGET_EXPR:
       return treat_class_rvalues_as_lvalues ? clk_class : clk_none;
 
-    case CALL_EXPR:
     case VA_ARG_EXPR:
+      return (treat_class_rvalues_as_lvalues
+             && CLASS_TYPE_P (TREE_TYPE (ref))
+             ? clk_class : clk_none);
+
+    case CALL_EXPR:
       /* Any class-valued call would be wrapped in a TARGET_EXPR.  */
       return clk_none;
 
index 98bfad4bc91a8cf00996a04f3009945f291990d3..67105b000d155775ede6af0b28d908a0bc1d1e60 100644 (file)
@@ -1,3 +1,8 @@
+2005-10-02  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/23840
+       * g++.dg/expr/stdarg1.C: New test.
+
 2005-10-02  Diego Novillo  <dnovillo@redhat.com>
 
        PR 24142
diff --git a/gcc/testsuite/g++.dg/expr/stdarg1.C b/gcc/testsuite/g++.dg/expr/stdarg1.C
new file mode 100644 (file)
index 0000000..85b6f74
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/23840
+
+#include <stdarg.h>
+struct S 
+{
+  int f(int);
+};
+void f(int i, ...) 
+{
+  va_list ap;
+  va_start (ap, i);
+  va_arg (ap, S).f(0);
+}