diff options
author | Mark Mitchell <mark@codesourcery.com> | 2004-11-25 17:11:37 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2004-11-25 17:11:37 +0000 |
commit | 5ae9ba3e4511a01ac7a8694dac5fb2989c87b8c8 (patch) | |
tree | 1f43cc1480d6fed656039fd8b9ad792166e521e4 /gcc/cp/class.c | |
parent | 87c465f52c1f582a61283932963305aab86e2aa6 (diff) | |
download | gcc-5ae9ba3e4511a01ac7a8694dac5fb2989c87b8c8.zip gcc-5ae9ba3e4511a01ac7a8694dac5fb2989c87b8c8.tar.gz gcc-5ae9ba3e4511a01ac7a8694dac5fb2989c87b8c8.tar.bz2 |
re PR c++/18001 (Badly formatted error message (quotation problem))
PR c++/18001
* c-common.h (lvalue_use): Move here from c-ctypeck.c.
(lvalue_or_else): Declare.
* c-common.c (lvalue_or_else): Move here from c-typeck.c.
* c-typeck.c (lvalue_use): Remove.
(lvalue_or_else): Remove.
PR c++/18556
* toplev.c (check_global_declarations): Set DECL_IGNORED_P on
unemitted variables with static storage duration.
PR c++/18445
* class.c (instantiate_type): Treat NON_DEPENDENT_EXPRs with
unknown_type as non matching. Tidy up.
* pt.c (build_non_dependent_expr): Do not build a
NON_DEPENDENT_EXPR for a VAR_DECL.
PR c++/18001
* cp-tree.h (lvalue_or_else): Remove declaration.
* tree.c (lvalue_or_else): Remove.
* typeck.c (build_unary_op): Adjust call to lvalue_or_else.
(build_modify_expr): Likewise.
PR c++/18625
* decl.c (duplicate_decls): Return error_mark_node on error, as
specified.
PR c++/18466
* decl.c (grokvardecl): Keep track of whether or not a there was
explicit qualification.
* name-lookup.c (set_decl_namespace): Complain about explicit
qualification of a name within its own namespace.
PR c++/18545
* typeck.c (check_return_expr): Robustify.
PR c++/18445
* g++.dg/template/crash28.C: Likewise.
PR c++/18001
* g++.dg/expr/unary2.C: Adjust lvalue messages.
* g++.dg/ext/lvaddr.C: Likewise.
* g++.dg/opt/pr7503-3.C: Likewise.
PR c++/18466
* g++.dg/parse/qualified3.C: New test.
* g++.old-deja/g++.other/friend7.C: Remove bogus qualification.
PR c++/18545
* g++.dg/expr/return1.C: New test.
From-SVN: r91301
Diffstat (limited to 'gcc/cp/class.c')
-rw-r--r-- | gcc/cp/class.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c index e146abc..3db223a 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5864,6 +5864,15 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags) if (TREE_CODE (rhs) == BASELINK) rhs = BASELINK_FUNCTIONS (rhs); + /* If we are in a template, and have a NON_DEPENDENT_EXPR, we cannot + deduce any type information. */ + if (TREE_CODE (rhs) == NON_DEPENDENT_EXPR) + { + if (flags & tf_error) + error ("not enough type information"); + return error_mark_node; + } + /* We don't overwrite rhs if it is an overloaded function. Copying it would destroy the tree link. */ if (TREE_CODE (rhs) != OVERLOAD) @@ -5904,14 +5913,15 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags) case COMPONENT_REF: { - tree addr = instantiate_type (lhstype, TREE_OPERAND (rhs, 1), flags); + tree member = TREE_OPERAND (rhs, 1); - if (addr != error_mark_node + member = instantiate_type (lhstype, member, flags); + if (member != error_mark_node && TREE_SIDE_EFFECTS (TREE_OPERAND (rhs, 0))) /* Do not lose object's side effects. */ - addr = build2 (COMPOUND_EXPR, TREE_TYPE (addr), - TREE_OPERAND (rhs, 0), addr); - return addr; + return build2 (COMPOUND_EXPR, TREE_TYPE (member), + TREE_OPERAND (rhs, 0), member); + return member; } case OFFSET_REF: @@ -5943,12 +5953,6 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags) /*template_only=*/false, /*explicit_targs=*/NULL_TREE); - case TREE_LIST: - /* Now we should have a baselink. */ - gcc_assert (BASELINK_P (rhs)); - - return instantiate_type (lhstype, BASELINK_FUNCTIONS (rhs), flags); - case CALL_EXPR: /* This is too hard for now. */ gcc_unreachable (); |