From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19004 invoked by alias); 5 Mar 2004 14:44:50 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 18992 invoked by uid 48); 5 Mar 2004 14:44:49 -0000 Date: Fri, 05 Mar 2004 14:44:00 -0000 Message-ID: <20040305144449.18991.qmail@sources.redhat.com> From: "nathan at gcc dot gnu dot org" To: gcc-bugs@gcc.gnu.org In-Reply-To: <20040106205426.13590.boris@kolpackov.net> References: <20040106205426.13590.boris@kolpackov.net> Reply-To: gcc-bugzilla@gcc.gnu.org Subject: [Bug c++/13590] [3.3/3.4/3.5 regression] Non-existing ambiguity when inhering through virtuals two identical using declarations. X-Bugzilla-Reason: CC X-SW-Source: 2004-03/txt/msg00715.txt.bz2 List-Id: ------- Additional Comments From nathan at gcc dot gnu dot org 2004-03-05 14:44 ------- I am not conviced this code is valid. [10.2] describes member name lookup in an MI lattice, and says that 'each declaration that was introduced by a using-declaration is considered to be from each subobject of C that is of the type containg the declaration descignated by the using declaration'. ... 'if the resulting set of declarations are not all from sbobjects of the same type ... there is an ambiguity'. Whilst those rules make sense for data members, they do not for function members. The set of overloaded functions can include some from a base, brought in by a using declaration, and some declared in the class containing the using declaration [7.3.3]/12 If those from the base were considered to actually be from the base, then we'd have a set from differnt types, so be ambiguous. Thus, I think we have to consider overloaded functions to be from the class containing the using declaration (and not the class being used). If that is the case, then the code is ill-formed, even though both using declarations refer to the same unambiguous base object. The original testcase had added an overload on one path through the graph, if we augment the case with an additional overload on the other path, it quite clearly must be ambiguous (because it would be without the using declarations). Wolfgang's reduced test case, with just using declarations it the other interesting example. If we treat this as ambiguous, then it appears that (in other useages), we could use using declarations to resolve inherited member ambiguities -- something expressly forbidden by [10.2] (footnote 96). So this argues that the reduced case should be well formed. But, now we have some strangeness. Whether a function using declaration's naming class is the class of the using declaration of the class of the used declaration depends on whether there are any additional overloads. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13590