From fdeff56396905c2701560ad90f1f1bcdd5c2fd55 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 12 Oct 2005 18:13:41 +0000 Subject: [PATCH] re PR c++/21592 (ICE in resolve_overloaded_unification/arg_assoc) cp: PR c++/21592 * pt.c (build_non_dependent_expr): Don't wrap a COMPONENT_REF with already looked up member functions. Assert we're not returning a NON_DEPENDENT_EXPR with unknown type. * typeck.c (finish_class_member_access_expr): We can get non-template-id-expr baselinks. If the lookup finds a baselink, remember it even inside templates. testsuite: PR c++/21592 * g++.dg/template/dependent-expr1.C: Add new expected error. * g++.dg/template/dependent-expr2.C: Adjust error text. * g++.dg/template/overload6.C: New. From-SVN: r105313 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/pt.c | 7 ++++++- gcc/cp/typeck.c | 11 +++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/dependent-expr1.C | 2 +- gcc/testsuite/g++.dg/template/dependent-expr2.C | 2 +- gcc/testsuite/g++.dg/template/overload6.C | 17 +++++++++++++++++ 7 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/overload6.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d6dad42f712..404c7de9943 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,13 @@ 2005-10-12 Nathan Sidwell + PR c++/21592 + * pt.c (build_non_dependent_expr): Don't wrap a COMPONENT_REF + with already looked up member functions. Assert we're not + returning a NON_DEPENDENT_EXPR with unknown type. + * typeck.c (finish_class_member_access_expr): We can get + non-template-id-expr baselinks. If the lookup finds a baselink, + remember it even inside templates. + PR c++/23797 * parser.c (cp_parser_functional_cast): Cope when TYPE is not a TYPE_DECL. Use dependent_type_p to check type. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 020d819488a..6724cf49b2e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -12641,7 +12641,9 @@ build_non_dependent_expr (tree expr) /* Preserve OVERLOADs; the functions must be available to resolve types. */ inner_expr = (TREE_CODE (expr) == ADDR_EXPR ? - TREE_OPERAND (expr, 0) : expr); + TREE_OPERAND (expr, 0) : + TREE_CODE (expr) == COMPONENT_REF ? + TREE_OPERAND (expr, 1) : expr); if (is_overloaded_fn (inner_expr) || TREE_CODE (inner_expr) == OFFSET_REF) return expr; @@ -12680,6 +12682,9 @@ build_non_dependent_expr (tree expr) TREE_OPERAND (expr, 0), build_non_dependent_expr (TREE_OPERAND (expr, 1))); + /* If the type is unknown, it can't really be non-dependent */ + gcc_assert (TREE_TYPE (expr) != unknown_type_node); + /* Otherwise, build a NON_DEPENDENT_EXPR. REFERENCE_TYPEs are not stripped for expressions in templates diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index d8210f1394b..d39b53ae967 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1904,11 +1904,8 @@ finish_class_member_access_expr (tree object, tree name) } if (BASELINK_P (name)) - { - /* A member function that has already been looked up. */ - gcc_assert (TREE_CODE (BASELINK_FUNCTIONS (name)) == TEMPLATE_ID_EXPR); - member = name; - } + /* A member function that has already been looked up. */ + member = name; else { bool is_template_id = false; @@ -2002,7 +1999,9 @@ finish_class_member_access_expr (tree object, tree name) /*preserve_reference=*/false); if (processing_template_decl && expr != error_mark_node) return build_min_non_dep (COMPONENT_REF, expr, - orig_object, orig_name, NULL_TREE); + orig_object, + BASELINK_P (member) ? member : orig_name, + NULL_TREE); return expr; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1f416b69132..9c14e0d2173 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2005-10-12 Nathan Sidwell + PR c++/21592 + * g++.dg/template/dependent-expr1.C: Add new expected error. + * g++.dg/template/dependent-expr2.C: Adjust error text. + * g++.dg/template/overload6.C: New. + PR c++/23797 * g++.dg/other/typename8.C: New. diff --git a/gcc/testsuite/g++.dg/template/dependent-expr1.C b/gcc/testsuite/g++.dg/template/dependent-expr1.C index e29b76d42d0..79649861ba4 100644 --- a/gcc/testsuite/g++.dg/template/dependent-expr1.C +++ b/gcc/testsuite/g++.dg/template/dependent-expr1.C @@ -19,7 +19,7 @@ namespace std Foo (sizeof (x)); Foo (__alignof__ (I)); Foo (__alignof__ (x)); - Foo (x->~I ()); + Foo (x->~I ()); // { dg-error "" } // Foo (typeid (I)); Foo (delete x); // { dg-error "" } Foo (delete[] x); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/dependent-expr2.C b/gcc/testsuite/g++.dg/template/dependent-expr2.C index 9c9d5f96673..06f056b4140 100644 --- a/gcc/testsuite/g++.dg/template/dependent-expr2.C +++ b/gcc/testsuite/g++.dg/template/dependent-expr2.C @@ -18,6 +18,6 @@ struct B { bool bar(A& a) { - return a.foo == 0; // { dg-error "insufficient context" "" } + return a.foo == 0; // { dg-error "" "" } } }; diff --git a/gcc/testsuite/g++.dg/template/overload6.C b/gcc/testsuite/g++.dg/template/overload6.C new file mode 100644 index 00000000000..478b466394a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload6.C @@ -0,0 +1,17 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 12 Oct 2005 + +// PR 21592:ICE +// Origin: Volker Reichelt + +template void unique(T,T); + +struct A +{ + int begin(); +}; + +template void foo() +{ + unique(A().begin); // { dg-error "no matching function" "" } +} -- 2.30.2