aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2006-10-02 22:21:02 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2006-10-02 22:21:02 +0000
commit3c17e16e318408f9f4dd6a7a8d2f4a567bb85c93 (patch)
tree0de8388354780a356e1169313f94c5b902134961 /gcc/cp
parent1c846af9c5feacfaaff015a38422eedebb3fdf95 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/typeck.c41
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. */