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:
parent
571640241c
commit
b4c74ba243
4 changed files with 31 additions and 3 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
14
gcc/testsuite/g++.dg/template/sizeof11.C
Normal file
14
gcc/testsuite/g++.dg/template/sizeof11.C
Normal 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" }
|
||||
}
|
||||
|
Loading…
Add table
Reference in a new issue