diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2005-10-12 18:13:41 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2005-10-12 18:13:41 +0000 |
commit | fdeff56396905c2701560ad90f1f1bcdd5c2fd55 (patch) | |
tree | 972b3ae09161bee749f644b55853df35eaf2009e | |
parent | 3ce5fa4fa606357251b653f66fbef96fdfcbea2f (diff) | |
download | gcc-fdeff56396905c2701560ad90f1f1bcdd5c2fd55.zip gcc-fdeff56396905c2701560ad90f1f1bcdd5c2fd55.tar.gz gcc-fdeff56396905c2701560ad90f1f1bcdd5c2fd55.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/pt.c | 7 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/dependent-expr1.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/dependent-expr2.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/overload6.C | 17 |
7 files changed, 43 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d6dad42..404c7de 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,13 @@ 2005-10-12 Nathan Sidwell <nathan@codesourcery.com> + 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 020d819..6724cf4 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 d8210f1..d39b53ae 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 1f416b6..9c14e0d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2005-10-12 Nathan Sidwell <nathan@codesourcery.com> + 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 e29b76d..7964986 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 9c9d5f9..06f056b 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 0000000..478b466 --- /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 <nathan@codesourcery.com> + +// PR 21592:ICE +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +template<typename T> void unique(T,T); + +struct A +{ + int begin(); +}; + +template<int> void foo() +{ + unique(A().begin); // { dg-error "no matching function" "" } +} |