From: Jason Merrill Date: Wed, 11 Jan 2012 03:04:49 +0000 (-0500) Subject: re PR c++/51614 (ICE with ambiguous base class) X-Git-Tag: releases/gcc-4.7.0~1058 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5313d330b2a6596686c2b5e04431c167ef4544be;p=thirdparty%2Fgcc.git re PR c++/51614 (ICE with ambiguous base class) PR c++/51614 * class.c (build_base_path): Diagnose ambiguous base. From-SVN: r183088 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4de8ba158dbe..9b080fbaeb80 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 79686a2cc0b2..58c89d3dafae 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 0afad2796a17..f41975cfa2e9 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 000000000000..3596bb5983e7 --- /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" } +};