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.
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)
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;
--- /dev/null
+// 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" }
+}
+