OSDN Git Service

PR c++/29435
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 16 Oct 2006 23:06:35 +0000 (23:06 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 16 Oct 2006 23:06:35 +0000 (23:06 +0000)
* typeck.c (cxx_sizeof_or_alignof_type): Complete non-dependent
types when their sizes are required.  Refine test for VLAs.
PR c++/29435
* g++.dg/template/sizeof11.C: New test.

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

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

index a4403a3..f07426a 100644 (file)
@@ -1,5 +1,9 @@
 2006-10-16  Mark Mitchell  <mark@codesourcery.com>
 
+       PR c++/29435
+       * typeck.c (cxx_sizeof_or_alignof_type): Complete non-dependent
+       types when their sizes are required.  Refine test for VLAs.
+
        PR c++/28211
        * parser.c (cp_parser_template_argument): Don't consider "&var" a
        possible constant-expression.
index 9f8d5e4..b9ee1f2 100644 (file)
@@ -1242,6 +1242,7 @@ tree
 cxx_sizeof_or_alignof_type (tree type, enum tree_code op, bool complain)
 {
   tree value;
+  bool dependent_p;
 
   gcc_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR);
   if (type == error_mark_node)
@@ -1256,15 +1257,19 @@ cxx_sizeof_or_alignof_type (tree type, enum tree_code op, bool complain)
       value = size_one_node;
     }
 
-  if (dependent_type_p (type)
+  dependent_p = dependent_type_p (type);
+  if (!dependent_p)
+    complete_type (type);
+  if (dependent_p
       /* 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))
+      || (processing_template_decl 
+         && COMPLETE_TYPE_P (type)
+         && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST))
     {
       value = build_min (op, size_type_node, type);
       TREE_READONLY (value) = 1;
index 5fed58b..9d450e7 100644 (file)
@@ -1,3 +1,8 @@
+2006-10-16  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/29435
+       * g++.dg/template/sizeof11.C: New test.
+
 2006-10-17  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/29392
diff --git a/gcc/testsuite/g++.dg/template/sizeof11.C b/gcc/testsuite/g++.dg/template/sizeof11.C
new file mode 100644 (file)
index 0000000..7428e0b
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/29435
+
+template < class T > struct A {};
+template < int> void g()
+{
+  sizeof (A < int>);
+}
+
+template < class T > struct B;
+template < int> void f()
+{
+  sizeof (B<int>); // { dg-error "incomplete" }
+}
+