<div dir="ltr">Thanks!</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jan 17, 2014 at 4:59 PM, Alp Toker <span dir="ltr"><<a href="mailto:alp@nuanti.com" target="_blank">alp@nuanti.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: alp<br>
Date: Fri Jan 17 18:59:32 2014<br>
New Revision: 199531<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=199531&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=199531&view=rev</a><br>
Log:<br>
Restrict redeclaration of tags introduced by using decls to MSVCCompat<br>
<br>
This limits the facility added in r199490 while we seek clarification on the<br>
standard.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/SemaDecl.cpp<br>
    cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp<br>
    cfe/trunk/test/SemaCXX/using-decl-1.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=199531&r1=199530&r2=199531&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=199531&r1=199530&r2=199531&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Jan 17 18:59:32 2014<br>
@@ -10681,8 +10681,9 @@ Decl *Sema::ActOnTag(Scope *S, unsigned<br>
   }<br>
<br>
   if (!Previous.empty()) {<br>
-    NamedDecl *DirectPrevDecl = *Previous.begin();<br>
-    NamedDecl *PrevDecl = DirectPrevDecl->getUnderlyingDecl();<br>
+    NamedDecl *PrevDecl = Previous.getFoundDecl();<br>
+    NamedDecl *DirectPrevDecl =<br>
+        getLangOpts().MSVCCompat ? *Previous.begin() : PrevDecl;<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>
<br>
Modified: cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp?rev=199531&r1=199530&r2=199531&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp?rev=199531&r1=199530&r2=199531&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp Fri Jan 17 18:59:32 2014<br>
@@ -120,6 +120,27 @@ private:<br>
<br>
 }<br>
<br>
+namespace using_tag_redeclaration<br>
+{<br>
+  struct S;<br>
+  namespace N {<br>
+    using ::using_tag_redeclaration::S;<br>
+    struct S {}; // expected-note {{previous definition is here}}<br>
+  }<br>
+  void f() {<br>
+    N::S s1;<br>
+    S s2;<br>
+  }<br>
+  void g() {<br>
+    struct S; // expected-note {{forward declaration of 'S'}}<br>
+    S s3; // expected-error {{variable has incomplete type 'S'}}<br>
+  }<br>
+  void h() {<br>
+    using ::using_tag_redeclaration::S;<br>
+    struct S {}; // expected-error {{redefinition of 'S'}}<br>
+  }<br>
+}<br>
+<br>
<br>
 namespace MissingTypename {<br>
<br>
<br>
Modified: cfe/trunk/test/SemaCXX/using-decl-1.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/using-decl-1.cpp?rev=199531&r1=199530&r2=199531&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/using-decl-1.cpp?rev=199531&r1=199530&r2=199531&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/SemaCXX/using-decl-1.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/using-decl-1.cpp Fri Jan 17 18:59:32 2014<br>
@@ -119,27 +119,6 @@ namespace foo<br>
   };<br>
 }<br>
<br>
-namespace using_tag_redeclaration<br>
-{<br>
-  struct S;<br>
-  namespace N {<br>
-    using ::using_tag_redeclaration::S;<br>
-    struct S {}; // expected-note {{previous definition is here}}<br>
-  }<br>
-  void f() {<br>
-    N::S s1;<br>
-    S s2;<br>
-  }<br>
-  void g() {<br>
-    struct S; // expected-note {{forward declaration of 'S'}}<br>
-    S s3; // expected-error {{variable has incomplete type 'S'}}<br>
-  }<br>
-  void h() {<br>
-    using ::using_tag_redeclaration::S;<br>
-    struct S {}; // expected-error {{redefinition of 'S'}}<br>
-  }<br>
-}<br>
-<br>
 // Don't suggest non-typenames for positions requiring typenames.<br>
 namespace using_suggestion_tyname_val {<br>
 namespace N { void FFF() {} }<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>