aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2002-01-29 09:52:51 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2002-01-29 09:52:51 +0000
commitb8b98c66af69365e645718d3bf72ccabaa6ef2ab (patch)
tree957d80217ed43186278a3c6bc7ccb26b5ef4b738 /gcc/cp
parentaee25e2d8eaf7610eef9a9ec234f0cd97bc1964b (diff)
downloadgcc-b8b98c66af69365e645718d3bf72ccabaa6ef2ab.zip
gcc-b8b98c66af69365e645718d3bf72ccabaa6ef2ab.tar.gz
gcc-b8b98c66af69365e645718d3bf72ccabaa6ef2ab.tar.bz2
re PR c++/5132 (NaN = 0.0 * HUGE_VAL fails to compile in templates)
cp: PR c++/5132 * typeck2.c (digest_init): Make sure non-array core type is instantiated. * decl2.c (reparse_absdcl_as_casts): Just store the type in the constructor, rather than build a new one. (build_expr_from_tree, CONSTRUCTOR case): Be careful with the PURPOSE of constructor elts. testsuite: * g++.dg/template/ctor1.C: Add instantiation. From-SVN: r49314
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/decl2.c30
-rw-r--r--gcc/cp/typeck2.c6
3 files changed, 40 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 3ea4070..567cd40 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,13 @@
+2002-01-29 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/5132
+ * typeck2.c (digest_init): Make sure non-array core type is
+ instantiated.
+ * decl2.c (reparse_absdcl_as_casts): Just store the type in the
+ constructor, rather than build a new one.
+ (build_expr_from_tree, CONSTRUCTOR case): Be careful with the
+ PURPOSE of constructor elts.
+
2002-01-23 Zack Weinberg <zack@codesourcery.com>
* Make-lang.in (parse.c): Adjust expected number of
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 67559b9..95f1427 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -3620,7 +3620,7 @@ reparse_absdcl_as_casts (decl, expr)
decl = TREE_OPERAND (decl, 0);
if (processing_template_decl)
- expr = build_min (CONSTRUCTOR, type, decl, CONSTRUCTOR_ELTS (expr));
+ TREE_TYPE (expr) = type;
else
{
expr = digest_init (type, expr, (tree *) 0);
@@ -3938,17 +3938,35 @@ build_expr_from_tree (t)
case CONSTRUCTOR:
{
tree r;
+ tree elts;
+ tree type = TREE_TYPE (t);
+ bool purpose_p;
/* digest_init will do the wrong thing if we let it. */
- if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
+ if (type && TYPE_PTRMEMFUNC_P (type))
return t;
- r = build_nt (CONSTRUCTOR, NULL_TREE,
- build_expr_from_tree (CONSTRUCTOR_ELTS (t)));
+ r = NULL_TREE;
+ /* We do not want to process the purpose of aggregate
+ initializers as they are identifier nodes which will be
+ looked up by digest_init. */
+ purpose_p = !(type && IS_AGGR_TYPE (type));
+ for (elts = CONSTRUCTOR_ELTS (t); elts; elts = TREE_CHAIN (elts))
+ {
+ tree purpose = TREE_PURPOSE (elts);
+ tree value = TREE_VALUE (elts);
+
+ if (purpose && purpose_p)
+ purpose = build_expr_from_tree (purpose);
+ value = build_expr_from_tree (value);
+ r = tree_cons (purpose, value, r);
+ }
+
+ r = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (r));
TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t);
- if (TREE_TYPE (t))
- return digest_init (TREE_TYPE (t), r, 0);
+ if (type)
+ return digest_init (type, r, 0);
return r;
}
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 1e93e62..314685a 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -458,6 +458,12 @@ digest_init (type, init, tail)
/* __PRETTY_FUNCTION__'s initializer is a bogus expression inside
a template function. This gets substituted during instantiation. */
return init;
+
+ /* We must strip the outermost array type when completing the type,
+ because the its bounds might be incomplete at the moment. */
+ if (!complete_type_or_else (TREE_CODE (type) == ARRAY_TYPE
+ ? TREE_TYPE (type) : type, NULL_TREE))
+ return error_mark_node;
/* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
if (TREE_CODE (init) == NON_LVALUE_EXPR)