diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a4403a38da8..f07426ab8c8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2006-10-16 Mark Mitchell + 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. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 9f8d5e4fad9..b9ee1f27876 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5fed58bc537..9d450e76b64 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-10-16 Mark Mitchell + + PR c++/29435 + * g++.dg/template/sizeof11.C: New test. + 2006-10-17 Paul Thomas 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 index 00000000000..7428e0b2380 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof11.C @@ -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); // { dg-error "incomplete" } +} +