diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2002-01-29 09:52:51 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2002-01-29 09:52:51 +0000 |
commit | b8b98c66af69365e645718d3bf72ccabaa6ef2ab (patch) | |
tree | 957d80217ed43186278a3c6bc7ccb26b5ef4b738 /gcc/cp | |
parent | aee25e2d8eaf7610eef9a9ec234f0cd97bc1964b (diff) | |
download | gcc-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/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 30 | ||||
-rw-r--r-- | gcc/cp/typeck2.c | 6 |
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) |