re PR c++/29435 (seg fault with sizeof and templates)

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++/29435
	* g++.dg/template/sizeof11.C: New test.

From-SVN: r117799
This commit is contained in:
Mark Mitchell 2006-10-16 23:06:35 +00:00 committed by Mark Mitchell
parent 571640241c
commit b4c74ba243
4 changed files with 31 additions and 3 deletions

View 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.

View 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;

View 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

View File

@ -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" }
}