From 5313d330b2a6596686c2b5e04431c167ef4544be Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 10 Jan 2012 22:04:49 -0500 Subject: [PATCH] re PR c++/51614 (ICE with ambiguous base class) PR c++/51614 * class.c (build_base_path): Diagnose ambiguous base. From-SVN: r183088 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/class.c | 19 +++++++++++++++++-- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/inherit/ambig1.C | 14 ++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/inherit/ambig1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4de8ba158db..9b080fbaeb8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2012-01-10 Jason Merrill + PR c++/51614 + * class.c (build_base_path): Diagnose ambiguous base. + PR c++/51433 * semantics.c (cxx_eval_call_expression): Always retry previously non-constant expressions. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 79686a2cc0b..58c89d3dafa 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -266,10 +266,25 @@ build_base_path (enum tree_code code, if (want_pointer) probe = TYPE_MAIN_VARIANT (TREE_TYPE (probe)); + if (code == PLUS_EXPR + && !SAME_BINFO_TYPE_P (BINFO_TYPE (d_binfo), probe)) + { + /* This can happen when adjust_result_of_qualified_name_lookup can't + find a unique base binfo in a call to a member function. We + couldn't give the diagnostic then since we might have been calling + a static member function, so we do it now. */ + if (complain & tf_error) + { + tree base = lookup_base (probe, BINFO_TYPE (d_binfo), + ba_unique, NULL); + gcc_assert (base == error_mark_node); + } + return error_mark_node; + } + gcc_assert ((code == MINUS_EXPR && SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), probe)) - || (code == PLUS_EXPR - && SAME_BINFO_TYPE_P (BINFO_TYPE (d_binfo), probe))); + || code == PLUS_EXPR); if (binfo == d_binfo) /* Nothing to do. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0afad2796a1..f41975cfa2e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2012-01-10 Jason Merrill + PR c++/51614 + * g++.dg/inherit/ambig1.C: New. + PR c++/51433 * g++.dg/cpp0x/constexpr-cache1.C: New. diff --git a/gcc/testsuite/g++.dg/inherit/ambig1.C b/gcc/testsuite/g++.dg/inherit/ambig1.C new file mode 100644 index 00000000000..3596bb5983e --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/ambig1.C @@ -0,0 +1,14 @@ +// PR c++/51614 + +struct A +{ + void foo(); +}; + +struct B : A {}; +struct C : A {}; + +struct D : B, C +{ + D() { A::foo(); } // { dg-error "ambiguous" } +}; -- 2.30.2