diff options
author | Mark Mitchell <mark@codesourcery.com> | 2006-10-02 22:21:02 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2006-10-02 22:21:02 +0000 |
commit | 3c17e16e318408f9f4dd6a7a8d2f4a567bb85c93 (patch) | |
tree | 0de8388354780a356e1169313f94c5b902134961 /gcc/cp | |
parent | 1c846af9c5feacfaaff015a38422eedebb3fdf95 (diff) | |
download | gcc-3c17e16e318408f9f4dd6a7a8d2f4a567bb85c93.zip gcc-3c17e16e318408f9f4dd6a7a8d2f4a567bb85c93.tar.gz gcc-3c17e16e318408f9f4dd6a7a8d2f4a567bb85c93.tar.bz2 |
re PR c++/29226 (ICE in make_decl_rtl, at varasm.c:886)
PR c++/29226
* typeck.c (cxx_sizeof_or_alignof_type): Tidy. In templates, do
not try to actually evaluate sizeof for a VLA type.
PR c++/29226
* g++.dg/template/vla1.C: New test.
From-SVN: r117375
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 41 |
2 files changed, 27 insertions, 20 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d21bf43..3c2ff36 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-10-02 Mark Mitchell <mark@codesourcery.com> + + PR c++/29226 + * typeck.c (cxx_sizeof_or_alignof_type): Tidy. In templates, do + not try to actually evaluate sizeof for a VLA type. + 2006-10-01 Mark Mitchell <mark@codesourcery.com> PR c++/29105 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 4713f05..9f8d5e4 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1241,38 +1241,39 @@ compparms (tree parms1, tree parms2) tree cxx_sizeof_or_alignof_type (tree type, enum tree_code op, bool complain) { - enum tree_code type_code; tree value; - const char *op_name; gcc_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR); if (type == error_mark_node) return error_mark_node; - if (dependent_type_p (type)) - { - value = build_min (op, size_type_node, type); - TREE_READONLY (value) = 1; - return value; - } - - op_name = operator_name_info[(int) op].name; - type = non_reference (type); - type_code = TREE_CODE (type); - - if (type_code == METHOD_TYPE) + if (TREE_CODE (type) == METHOD_TYPE) { if (complain && (pedantic || warn_pointer_arith)) - pedwarn ("invalid application of %qs to a member function", op_name); + pedwarn ("invalid application of %qs to a member function", + operator_name_info[(int) op].name); value = size_one_node; } - else - value = c_sizeof_or_alignof_type (complete_type (type), - op == SIZEOF_EXPR, - complain); - return value; + if (dependent_type_p (type) + /* 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)) + { + value = build_min (op, size_type_node, type); + TREE_READONLY (value) = 1; + return value; + } + + return c_sizeof_or_alignof_type (complete_type (type), + op == SIZEOF_EXPR, + complain); } /* Process a sizeof expression where the operand is an expression. */ |