OSDN Git Service

PR c++/29226
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 2 Oct 2006 22:21:02 +0000 (22:21 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 2 Oct 2006 22:21:02 +0000 (22:21 +0000)
* typeck.c (cxx_sizeof_or_alignof_type): Tidy.  In templates, do
not try to actually evaluate sizeof for a VLA type.
PR c++/29226
* g++.dg/template/vla1.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117375 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/vla1.C [new file with mode: 0644]

index d21bf43..3c2ff36 100644 (file)
@@ -1,3 +1,9 @@
+2006-10-02  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/29226
+       * typeck.c (cxx_sizeof_or_alignof_type): Tidy.  In templates, do
+       not try to actually evaluate sizeof for a VLA type.
+
 2006-10-01  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/29105
index 4713f05..9f8d5e4 100644 (file)
@@ -1241,38 +1241,39 @@ compparms (tree parms1, tree parms2)
 tree
 cxx_sizeof_or_alignof_type (tree type, enum tree_code op, bool complain)
 {
-  enum tree_code type_code;
   tree value;
-  const char *op_name;
 
   gcc_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR);
   if (type == error_mark_node)
     return error_mark_node;
 
-  if (dependent_type_p (type))
-    {
-      value = build_min (op, size_type_node, type);
-      TREE_READONLY (value) = 1;
-      return value;
-    }
-
-  op_name = operator_name_info[(int) op].name;
-
   type = non_reference (type);
-  type_code = TREE_CODE (type);
-
-  if (type_code == METHOD_TYPE)
+  if (TREE_CODE (type) == METHOD_TYPE)
     {
       if (complain && (pedantic || warn_pointer_arith))
-       pedwarn ("invalid application of %qs to a member function", op_name);
+       pedwarn ("invalid application of %qs to a member function", 
+                operator_name_info[(int) op].name);
       value = size_one_node;
     }
-  else
-    value = c_sizeof_or_alignof_type (complete_type (type),
-                                     op == SIZEOF_EXPR,
-                                     complain);
 
-  return value;
+  if (dependent_type_p (type)
+      /* VLA types will have a non-constant size.  In the body of an
+        uninstantiated template, we don't need to try to compute the
+        value, because the sizeof expression is not an integral
+        constant expression in that case.  And, if we do try to
+        compute the value, we'll likely end up with SAVE_EXPRs, which
+        the template substitution machinery does not expect to see.  */
+      || (processing_template_decl && 
+         TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST))
+    {
+      value = build_min (op, size_type_node, type);
+      TREE_READONLY (value) = 1;
+      return value;
+    }
+
+  return c_sizeof_or_alignof_type (complete_type (type),
+                                  op == SIZEOF_EXPR,
+                                  complain);
 }
 
 /* Process a sizeof expression where the operand is an expression.  */
index b4c70d2..2b1bcad 100644 (file)
@@ -1,3 +1,8 @@
+2006-10-02  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/29226
+       * g++.dg/template/vla1.C: New test.
+
 2006-10-02  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        PR fortran/29210
diff --git a/gcc/testsuite/g++.dg/template/vla1.C b/gcc/testsuite/g++.dg/template/vla1.C
new file mode 100644 (file)
index 0000000..fe93440
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/29226
+// { dg-options "" }
+
+template <bool>
+static int label (int w)
+{
+  sizeof(int[w]);
+}
+int a = label<false>(1);