Commit b4c74ba2 by Mark Mitchell Committed by Mark Mitchell

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
parent 57164024
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.
......
......@@ -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;
......
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
// 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" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment