Hi,
On 02/13/2015 04:03 PM, Jason Merrill wrote:
On 02/11/2015 02:10 PM, Paolo Carlini wrote:
Today I was having a look to this pending issue and went astray due to
the broken thread: I wondered if, basing on Fabien' first try and the
comments accompanying tag_scope, it would make sense to use
strip_using_decl only when the scope is ts_global (or maybe !=
ts_current)?!?
Good thought, that makes sense and is a lot simpler. But I think
since we have a ts_global block earlier in the function, let's do the
stripping there, right after the call to lookup_name_prefer_type. OK
with that change.
Thanks. Thus I'm going to resolve the issue at least in mainline and
4_9-branch with the below.
While working on this issue I noticed that we have another regression,
which appeared in 4_7, having to do with using declarations but not
involving redeclarations or redundant 'struct' in parameters:
struct B
{
template<typename T>
struct S {};
};
struct D : B
{
using B::S;
template<typename T>
void doIt(/*struct*/ S<T>&);
};
Anything you would recommend besides filing a new Bug Report (or marking
an existing one as regression)?!?
Thanks,
Paolo.
//////////////////////////
/cp
2015-02-13 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/60894
* decl.c (lookup_and_check_tag): Use strip_using_decl.
/testsuite
2015-02-13 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/60894
* g++.dg/lookup/using54.C: New.
Index: cp/decl.c
===================================================================
--- cp/decl.c (revision 220688)
+++ cp/decl.c (working copy)
@@ -12205,6 +12205,7 @@ lookup_and_check_tag (enum tag_types tag_code, tre
/* First try ordinary name lookup, ignoring hidden class name
injected via friend declaration. */
decl = lookup_name_prefer_type (name, 2);
+ decl = strip_using_decl (decl);
/* If that fails, the name will be placed in the smallest
non-class, non-function-prototype scope according to 3.3.1/5.
We may already have a hidden name declared as friend in this
Index: testsuite/g++.dg/lookup/using54.C
===================================================================
--- testsuite/g++.dg/lookup/using54.C (revision 0)
+++ testsuite/g++.dg/lookup/using54.C (working copy)
@@ -0,0 +1,16 @@
+// PR c++/60894
+
+struct B
+{
+ struct S {};
+};
+
+struct D : B
+{
+ using B::S;
+ void doIt(struct S&);
+};
+
+void D::doIt(struct S&)
+{
+}