<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Jul 6, 2015 at 2:56 PM, Sean Silva <span dir="ltr"><<a href="mailto:chisophugis@gmail.com" target="_blank">chisophugis@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><span class=""><span style="font-size:13px">+ if (SS.isEmpty() && TUK != TUK_Reference && TUK != TUK_Friend &&</span><br style="font-size:13px"><span style="font-size:13px">+ isDeclInScope(Shadow, SearchDC, S, isExplicitSpecialization) &&</span><br style="font-size:13px"><span style="font-size:13px">+ !(OldTag &&</span><br style="font-size:13px"><span style="font-size:13px">+ (getLangOpts().MSVCCompat</span><br style="font-size:13px"><span style="font-size:13px">+ ? SearchDC->getRedeclContext()-></span><span style="font-size:13px">Encloses(</span><br style="font-size:13px"><span style="font-size:13px">+ OldTag->getDeclContext()-></span><span style="font-size:13px">getRedeclContext()) ||</span><br style="font-size:13px"><span style="font-size:13px">+ OldTag->getDeclContext()-></span><span style="font-size:13px">getRedeclContext()->Encloses(</span><br style="font-size:13px"><span style="font-size:13px">+ SearchDC->getRedeclContext())</span><br style="font-size:13px"><span style="font-size:13px">+ : SearchDC->getRedeclContext()-></span><span style="font-size:13px">Equals(</span><br style="font-size:13px"><span style="font-size:13px">+ OldTag->getDeclContext()-></span><span style="font-size:13px">getRedeclContext())))) {</span><br><div><span style="font-size:13px"><br></span></div></span><div><span style="font-size:13px">Can you simplify this?</span></div></div></blockquote><div><br></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div>Sure, r241518.</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div><span style="font-size:13px">It has a ways to go yet, but it is starting to smell of the infamous </span><a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_gcc-2Dmirror_gcc_blob_7057506456ba18f080679b2fe55ec56ee90fd81c_gcc_reload.c-23L1056-2DL1111&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=G4s7ofgTHTumXvucN4WtiadV8bHb3zcJJQCfH0DbTUg&s=8Z5CiMDeGRAIxsf-qPvbnnnHL0ck7SsKHo4jEuMlxHs&e=" target="_blank">https://github.com/gcc-mirror/gcc/blob/7057506456ba18f080679b2fe55ec56ee90fd81c/gcc/reload.c#L1056-L1111</a></div></div></blockquote><div><br></div><div>Hah, low blow :-)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><span class=""><font color="#888888"><div>-- Sean Silva</div><div><span style="font-size:13px"><br></span></div></font></span></div><div class=""><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jul 5, 2015 at 9:43 PM, Richard Smith <span dir="ltr"><<a href="mailto:richard-llvm@metafoo.co.uk" target="_blank">richard-llvm@metafoo.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: rsmith<br>
Date: Sun Jul 5 23:43:58 2015<br>
New Revision: 241428<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D241428-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=G4s7ofgTHTumXvucN4WtiadV8bHb3zcJJQCfH0DbTUg&s=0Z1VjkMEw9IqB-jg-e3NHbHBDPV_0lWbngGD5icMAzs&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=241428&view=rev</a><br>
Log:<br>
PR24030, PR24033: Consistently check whether a new declaration conflicts with<br>
an existing using shadow declaration if they define entities of the same kind<br>
in different namespaces.<br>
<br>
We'd previously check this consistently if the using-declaration came after the<br>
other declaration, but not if it came before.<br>
<br>
Modified:<br>
cfe/trunk/lib/Sema/SemaDecl.cpp<br>
cfe/trunk/lib/Sema/SemaTemplate.cpp<br>
cfe/trunk/test/SemaCXX/lookup-member.cpp<br>
cfe/trunk/test/SemaCXX/using-decl-1.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Sema_SemaDecl.cpp-3Frev-3D241428-26r1-3D241427-26r2-3D241428-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=G4s7ofgTHTumXvucN4WtiadV8bHb3zcJJQCfH0DbTUg&s=15HNcgIVMmUWPW6UEDvcc4zCqNJwMqouDFcDhULMdx4&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=241428&r1=241427&r2=241428&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Sun Jul 5 23:43:58 2015<br>
@@ -2577,6 +2577,48 @@ static bool haveIncompatibleLanguageLink<br>
return false;<br>
}<br>
<br>
+template<typename T> static bool isExternC(T *D) { return D->isExternC(); }<br>
+static bool isExternC(VarTemplateDecl *) { return false; }<br>
+<br>
+/// \brief Check whether a redeclaration of an entity introduced by a<br>
+/// using-declaration is valid, given that we know it's not an overload<br>
+/// (nor a hidden tag declaration).<br>
+template<typename ExpectedDecl><br>
+static bool checkUsingShadowRedecl(Sema &S, UsingShadowDecl *OldS,<br>
+ ExpectedDecl *New) {<br>
+ // C++11 [basic.scope.declarative]p4:<br>
+ // Given a set of declarations in a single declarative region, each of<br>
+ // which specifies the same unqualified name,<br>
+ // -- they shall all refer to the same entity, or all refer to functions<br>
+ // and function templates; or<br>
+ // -- exactly one declaration shall declare a class name or enumeration<br>
+ // name that is not a typedef name and the other declarations shall all<br>
+ // refer to the same variable or enumerator, or all refer to functions<br>
+ // and function templates; in this case the class name or enumeration<br>
+ // name is hidden (3.3.10).<br>
+<br>
+ // C++11 [namespace.udecl]p14:<br>
+ // If a function declaration in namespace scope or block scope has the<br>
+ // same name and the same parameter-type-list as a function introduced<br>
+ // by a using-declaration, and the declarations do not declare the same<br>
+ // function, the program is ill-formed.<br>
+<br>
+ auto *Old = dyn_cast<ExpectedDecl>(OldS->getTargetDecl());<br>
+ if (Old &&<br>
+ !Old->getDeclContext()->getRedeclContext()->Equals(<br>
+ New->getDeclContext()->getRedeclContext()) &&<br>
+ !(isExternC(Old) && isExternC(New)))<br>
+ Old = nullptr;<br>
+<br>
+ if (!Old) {<br>
+ S.Diag(New->getLocation(), diag::err_using_decl_conflict_reverse);<br>
+ S.Diag(OldS->getTargetDecl()->getLocation(), diag::note_using_decl_target);<br>
+ S.Diag(OldS->getUsingDecl()->getLocation(), diag::note_using_decl) << 0;<br>
+ return true;<br>
+ }<br>
+ return false;<br>
+}<br>
+<br>
/// MergeFunctionDecl - We just parsed a function 'New' from<br>
/// declarator D which has the same name and scope as a previous<br>
/// declaration 'Old'. Figure out how to resolve this situation,<br>
@@ -2603,28 +2645,10 @@ bool Sema::MergeFunctionDecl(FunctionDec<br>
return true;<br>
}<br>
<br>
- // C++11 [namespace.udecl]p14:<br>
- // If a function declaration in namespace scope or block scope has the<br>
- // same name and the same parameter-type-list as a function introduced<br>
- // by a using-declaration, and the declarations do not declare the same<br>
- // function, the program is ill-formed.<br>
-<br>
// Check whether the two declarations might declare the same function.<br>
- Old = dyn_cast<FunctionDecl>(Shadow->getTargetDecl());<br>
- if (Old &&<br>
- !Old->getDeclContext()->getRedeclContext()->Equals(<br>
- New->getDeclContext()->getRedeclContext()) &&<br>
- !(Old->isExternC() && New->isExternC()))<br>
- Old = nullptr;<br>
-<br>
- if (!Old) {<br>
- Diag(New->getLocation(), diag::err_using_decl_conflict_reverse);<br>
- Diag(Shadow->getTargetDecl()->getLocation(),<br>
- diag::note_using_decl_target);<br>
- Diag(Shadow->getUsingDecl()->getLocation(), diag::note_using_decl) << 0;<br>
+ if (checkUsingShadowRedecl<FunctionDecl>(*this, Shadow, New))<br>
return true;<br>
- }<br>
- OldD = Old;<br>
+ OldD = Old = cast<FunctionDecl>(Shadow->getTargetDecl());<br>
} else {<br>
Diag(New->getLocation(), diag::err_redefinition_different_kind)<br>
<< New->getDeclName();<br>
@@ -3309,8 +3333,19 @@ void Sema::MergeVarDecl(VarDecl *New, Lo<br>
if (NewTemplate) {<br>
OldTemplate = dyn_cast<VarTemplateDecl>(Previous.getFoundDecl());<br>
Old = OldTemplate ? OldTemplate->getTemplatedDecl() : nullptr;<br>
- } else<br>
+<br>
+ if (auto *Shadow =<br>
+ dyn_cast<UsingShadowDecl>(Previous.getRepresentativeDecl()))<br>
+ if (checkUsingShadowRedecl<VarTemplateDecl>(*this, Shadow, NewTemplate))<br>
+ return New->setInvalidDecl();<br>
+ } else {<br>
Old = dyn_cast<VarDecl>(Previous.getFoundDecl());<br>
+<br>
+ if (auto *Shadow =<br>
+ dyn_cast<UsingShadowDecl>(Previous.getRepresentativeDecl()))<br>
+ if (checkUsingShadowRedecl<VarDecl>(*this, Shadow, New))<br>
+ return New->setInvalidDecl();<br>
+ }<br>
}<br>
if (!Old) {<br>
Diag(New->getLocation(), diag::err_redefinition_different_kind)<br>
@@ -11733,8 +11768,7 @@ Decl *Sema::ActOnTag(Scope *S, unsigned<br>
<br>
if (!Previous.empty()) {<br>
NamedDecl *PrevDecl = Previous.getFoundDecl();<br>
- NamedDecl *DirectPrevDecl =<br>
- getLangOpts().MSVCCompat ? *Previous.begin() : PrevDecl;<br>
+ NamedDecl *DirectPrevDecl = Previous.getRepresentativeDecl();<br>
<br>
// It's okay to have a tag decl in the same scope as a typedef<br>
// which hides a tag decl in the same scope. Finding this<br>
@@ -11761,6 +11795,32 @@ Decl *Sema::ActOnTag(Scope *S, unsigned<br>
}<br>
}<br>
<br>
+ // If this is a redeclaration of a using shadow declaration, it must<br>
+ // declare a tag in the same context. In MSVC mode, we allow a<br>
+ // redefinition if either context is within the other.<br>
+ if (auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {<br>
+ auto *OldTag = dyn_cast<TagDecl>(PrevDecl);<br>
+ if (SS.isEmpty() && TUK != TUK_Reference && TUK != TUK_Friend &&<br>
+ isDeclInScope(Shadow, SearchDC, S, isExplicitSpecialization) &&<br>
+ !(OldTag &&<br>
+ (getLangOpts().MSVCCompat<br>
+ ? SearchDC->getRedeclContext()->Encloses(<br>
+ OldTag->getDeclContext()->getRedeclContext()) ||<br>
+ OldTag->getDeclContext()->getRedeclContext()->Encloses(<br>
+ SearchDC->getRedeclContext())<br>
+ : SearchDC->getRedeclContext()->Equals(<br>
+ OldTag->getDeclContext()->getRedeclContext())))) {<br>
+ Diag(KWLoc, diag::err_using_decl_conflict_reverse);<br>
+ Diag(Shadow->getTargetDecl()->getLocation(),<br>
+ diag::note_using_decl_target);<br>
+ Diag(Shadow->getUsingDecl()->getLocation(), diag::note_using_decl)<br>
+ << 0;<br>
+ // Recover by ignoring the old declaration.<br>
+ Previous.clear();<br>
+ goto CreateNewDecl;<br>
+ }<br>
+ }<br>
+<br>
if (TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {<br>
// If this is a use of a previous tag, or if the tag is already declared<br>
// in the same scope (so that the definition/declaration completes or<br>
@@ -11949,7 +12009,7 @@ Decl *Sema::ActOnTag(Scope *S, unsigned<br>
Invalid = true;<br>
<br>
// Otherwise, only diagnose if the declaration is in scope.<br>
- } else if (!isDeclInScope(PrevDecl, SearchDC, S,<br>
+ } else if (!isDeclInScope(DirectPrevDecl, SearchDC, S,<br>
SS.isNotEmpty() || isExplicitSpecialization)) {<br>
// do nothing<br>
<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Sema_SemaTemplate.cpp-3Frev-3D241428-26r1-3D241427-26r2-3D241428-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=G4s7ofgTHTumXvucN4WtiadV8bHb3zcJJQCfH0DbTUg&s=kxUWiaHe2Njddk66ZM0uHqzZhrVki3uDGGKC8L6sp_c&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=241428&r1=241427&r2=241428&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Sun Jul 5 23:43:58 2015<br>
@@ -957,8 +957,7 @@ Sema::CheckClassTemplate(Scope *S, unsig<br>
<br>
// Check that the chosen semantic context doesn't already contain a<br>
// declaration of this name as a non-tag type.<br>
- LookupResult Previous(*this, Name, NameLoc, LookupOrdinaryName,<br>
- ForRedeclaration);<br>
+ Previous.clear(LookupOrdinaryName);<br>
DeclContext *LookupContext = SemanticContext;<br>
while (LookupContext->isTransparentContext())<br>
LookupContext = LookupContext->getLookupParent();<br>
@@ -972,9 +971,25 @@ Sema::CheckClassTemplate(Scope *S, unsig<br>
}<br>
}<br>
} else if (PrevDecl &&<br>
- !isDeclInScope(PrevDecl, SemanticContext, S, SS.isValid()))<br>
+ !isDeclInScope(Previous.getRepresentativeDecl(), SemanticContext,<br>
+ S, SS.isValid()))<br>
PrevDecl = PrevClassTemplate = nullptr;<br>
<br>
+ if (auto *Shadow = dyn_cast_or_null<UsingShadowDecl>(<br>
+ PrevDecl ? Previous.getRepresentativeDecl() : nullptr)) {<br>
+ if (SS.isEmpty() &&<br>
+ !(PrevClassTemplate &&<br>
+ PrevClassTemplate->getDeclContext()->getRedeclContext()->Equals(<br>
+ SemanticContext->getRedeclContext()))) {<br>
+ Diag(KWLoc, diag::err_using_decl_conflict_reverse);<br>
+ Diag(Shadow->getTargetDecl()->getLocation(),<br>
+ diag::note_using_decl_target);<br>
+ Diag(Shadow->getUsingDecl()->getLocation(), diag::note_using_decl) << 0;<br>
+ // Recover by ignoring the old declaration.<br>
+ PrevDecl = PrevClassTemplate = nullptr;<br>
+ }<br>
+ }<br>
+<br>
if (PrevClassTemplate) {<br>
// Ensure that the template parameter lists are compatible. Skip this check<br>
// for a friend in a dependent context: the template parameter list itself<br>
<br>
Modified: cfe/trunk/test/SemaCXX/lookup-member.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_SemaCXX_lookup-2Dmember.cpp-3Frev-3D241428-26r1-3D241427-26r2-3D241428-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=G4s7ofgTHTumXvucN4WtiadV8bHb3zcJJQCfH0DbTUg&s=RXqQmT0KbJawl7f5rjO0fn86BpueinnjUdgTwgJBs60&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/lookup-member.cpp?rev=241428&r1=241427&r2=241428&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaCXX/lookup-member.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/lookup-member.cpp Sun Jul 5 23:43:58 2015<br>
@@ -1,12 +1,11 @@<br>
// RUN: %clang_cc1 -fsyntax-only -verify %s<br>
-// expected-no-diagnostics<br>
<br>
namespace A {<br>
- class String;<br>
+ class String; // expected-note {{target of using declaration}}<br>
};<br>
<br>
-using A::String;<br>
-class String;<br>
+using A::String; // expected-note {{using declaration}}<br>
+class String; // expected-error {{conflicts with target of using declaration}}<br>
<br>
// rdar://8603569<br>
union value {<br>
<br>
Modified: cfe/trunk/test/SemaCXX/using-decl-1.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_SemaCXX_using-2Ddecl-2D1.cpp-3Frev-3D241428-26r1-3D241427-26r2-3D241428-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=G4s7ofgTHTumXvucN4WtiadV8bHb3zcJJQCfH0DbTUg&s=AVgH0qH8CSwiEhFf_3I0RG64gty5AZveKN0rV6o1XZk&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/using-decl-1.cpp?rev=241428&r1=241427&r2=241428&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaCXX/using-decl-1.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/using-decl-1.cpp Sun Jul 5 23:43:58 2015<br>
@@ -263,3 +263,67 @@ struct B : A {<br>
static int f() { return n; } // expected-error {{invalid use of member 'n' in static member function}}<br>
};<br>
}<br>
+<br>
+namespace PR24030 {<br>
+ namespace X {<br>
+ class A; // expected-note {{target}}<br>
+ int i; // expected-note {{target}}<br>
+ }<br>
+ namespace Y {<br>
+ using X::A; // expected-note {{using}}<br>
+ using X::i; // expected-note {{using}}<br>
+ class A {}; // expected-error {{conflicts}}<br>
+ int i; // expected-error {{conflicts}}<br>
+ }<br>
+}<br>
+<br>
+namespace PR24033 {<br>
+ extern int a; // expected-note 2{{target of using declaration}}<br>
+ void f(); // expected-note 2{{target of using declaration}}<br>
+ struct s; // expected-note 2{{target of using declaration}}<br>
+ enum e {}; // expected-note 2{{target of using declaration}}<br>
+<br>
+ template<typename> extern int vt; // expected-note 2{{target of using declaration}} expected-warning 0-1{{extension}}<br>
+ template<typename> void ft(); // expected-note 2{{target of using declaration}}<br>
+ template<typename> struct st; // expected-note 2{{target of using declaration}}<br>
+<br>
+ namespace X {<br>
+ using PR24033::a; // expected-note {{using declaration}}<br>
+ using PR24033::f; // expected-note {{using declaration}}<br>
+ using PR24033::s; // expected-note {{using declaration}}<br>
+ using PR24033::e; // expected-note {{using declaration}}<br>
+<br>
+ using PR24033::vt; // expected-note {{using declaration}}<br>
+ using PR24033::ft; // expected-note {{using declaration}}<br>
+ using PR24033::st; // expected-note {{using declaration}}<br>
+<br>
+ extern int a; // expected-error {{declaration conflicts with target of using declaration already in scope}}<br>
+ void f(); // expected-error {{declaration conflicts with target of using declaration already in scope}}<br>
+ struct s; // expected-error {{declaration conflicts with target of using declaration already in scope}}<br>
+ enum e {}; // expected-error {{declaration conflicts with target of using declaration already in scope}}<br>
+<br>
+ template<typename> extern int vt; // expected-error {{declaration conflicts with target of using declaration already in scope}} expected-warning 0-1{{extension}}<br>
+ template<typename> void ft(); // expected-error {{declaration conflicts with target of using declaration already in scope}}<br>
+ template<typename> struct st; // expected-error {{declaration conflicts with target of using declaration already in scope}}<br>
+ }<br>
+<br>
+ namespace Y {<br>
+ extern int a; // expected-note {{conflicting declaration}}<br>
+ void f(); // expected-note {{conflicting declaration}}<br>
+ struct s; // expected-note {{conflicting declaration}}<br>
+ enum e {}; // expected-note {{conflicting declaration}}<br>
+<br>
+ template<typename> extern int vt; // expected-note {{conflicting declaration}} expected-warning 0-1{{extension}}<br>
+ template<typename> void ft(); // expected-note {{conflicting declaration}}<br>
+ template<typename> struct st; // expected-note {{conflicting declaration}}<br>
+<br>
+ using PR24033::a; // expected-error {{target of using declaration conflicts with declaration already in scope}}<br>
+ using PR24033::f; // expected-error {{target of using declaration conflicts with declaration already in scope}}<br>
+ using PR24033::s; // expected-error {{target of using declaration conflicts with declaration already in scope}}<br>
+ using PR24033::e; // expected-error {{target of using declaration conflicts with declaration already in scope}}<br>
+<br>
+ using PR24033::vt; // expected-error {{target of using declaration conflicts with declaration already in scope}}<br>
+ using PR24033::ft; // expected-error {{target of using declaration conflicts with declaration already in scope}}<br>
+ using PR24033::st; // expected-error {{target of using declaration conflicts with declaration already in scope}}<br>
+ }<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div></div>