<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>