Endill created this revision.
Endill added a reviewer: clang-language-wg.
Herald added a project: All.
Endill requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

P1787 <https://wg21.link/p1787>: CWG1894 and its duplicate CWG2199 are resolved 
per Richard’s proposal for “dr407 still leaves open questions about typedef / 
tag hiding” 
<https://listarchives.isocpp.org/cgi-bin/wg21/message?wg=core&msg=28415>, using 
generic conflicting-declaration rules even for typedef, and discarding a 
redundant typedef-name when looking up an elaborated-type-specifier.
Wording: See changes to [dcl.typedef], [basic.lookup.elab], and 
[basic.lookup]/4.

Generic conflicting-declaration rules are specified in changes to 
[basic.scope.scope]. CWG407 <https://cplusplus.github.io/CWG/issues/407.html>, 
CWG1894 <https://cplusplus.github.io/CWG/issues/1894.html>, and CWG2199 
<https://cplusplus.github.io/CWG/issues/2199.html> discuss how elaborated type 
specifiers interact with typedef, using directives, and using declarations. 
Since existing test for CWG407 covers examples provided in CWG1894 and CWG2199, 
and does it in accordance with P1787 <https://reviews.llvm.org/P1787>, I reused 
it.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D148136

Files:
  clang/test/CXX/drs/dr18xx.cpp
  clang/test/CXX/drs/dr21xx.cpp
  clang/test/CXX/drs/dr4xx.cpp
  clang/www/cxx_dr_status.html

Index: clang/www/cxx_dr_status.html
===================================================================
--- clang/www/cxx_dr_status.html
+++ clang/www/cxx_dr_status.html
@@ -11171,7 +11171,7 @@
     <td><a href="https://wg21.link/cwg1894";>1894</a></td>
     <td>CD6</td>
     <td><I>typedef-name</I>s and <I>using-declaration</I>s</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Clang 3.8</td>
   </tr>
   <tr id="1895">
     <td><a href="https://wg21.link/cwg1895";>1895</a></td>
@@ -13001,7 +13001,7 @@
     <td><a href="https://wg21.link/cwg2199";>2199</a></td>
     <td>CD6</td>
     <td>Typedefs and tags</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Clang 3.8</td>
   </tr>
   <tr id="2200">
     <td><a href="https://wg21.link/cwg2200";>2200</a></td>
Index: clang/test/CXX/drs/dr4xx.cpp
===================================================================
--- clang/test/CXX/drs/dr4xx.cpp
+++ clang/test/CXX/drs/dr4xx.cpp
@@ -124,6 +124,7 @@
 }
 
 namespace dr407 { // dr407: 3.8
+                  // NB: reused by dr1894 and dr2199
   struct S;
   typedef struct S S;
   void f() {
Index: clang/test/CXX/drs/dr21xx.cpp
===================================================================
--- clang/test/CXX/drs/dr21xx.cpp
+++ clang/test/CXX/drs/dr21xx.cpp
@@ -1,7 +1,9 @@
 // RUN: %clang_cc1 -std=c++98 -triple x86_64-unknown-unknown %s -verify -fexceptions -Wno-deprecated-builtins -fcxx-exceptions -pedantic-errors
 // RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown %s -verify -fexceptions -Wno-deprecated-builtins -fcxx-exceptions -pedantic-errors
 // RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown %s -verify -fexceptions -Wno-deprecated-builtins -fcxx-exceptions -pedantic-errors
-// RUN: %clang_cc1 -std=c++1z -triple x86_64-unknown-unknown %s -verify -fexceptions -Wno-deprecated-builtins -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-unknown %s -verify -fexceptions -Wno-deprecated-builtins -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-unknown %s -verify -fexceptions -Wno-deprecated-builtins -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++2b -triple x86_64-unknown-unknown %s -verify -fexceptions -Wno-deprecated-builtins -fcxx-exceptions -pedantic-errors
 
 #if __cplusplus < 201103L
 // expected-error@+1 {{variadic macro}}
@@ -188,3 +190,60 @@
   B &B::operator=(B&&) = default; // expected-error {{would delete}} expected-note@-10{{inaccessible move assignment}}
 #endif
 }
+
+namespace dr2199 { // dr2199: 3.8
+                   // NB: reusing dr407 test
+  struct S;
+  typedef struct S S;
+  void f() {
+    struct S *p;
+    {
+      typedef struct S S; // #dr2199-typedef-S-S
+      struct S *p;
+      // expected-error@-1 {{typedef 'S' cannot be referenced with a struct specifier}}
+      // expected-note@#dr2199-typedef-S-S {{here}}
+    }
+  }
+  struct S {};
+
+  namespace UsingDir {
+    namespace A {
+      struct S {}; // #dr2199-struct-S
+    }
+    namespace B {
+      typedef int S; // #dr2199-typedef-int-S
+    }
+    namespace C {
+      using namespace A;
+      using namespace B;
+      struct S s;
+      // expected-error@-1 {{ambiguous}}
+      // expected-note@#dr2199-struct-S {{candidate}}
+      // expected-note@#dr2199-typedef-int-S {{candidate}}
+    }
+    namespace D {
+      using A::S;
+      typedef struct S S;
+      struct S s;
+    }
+    namespace E {
+      typedef A::S S;
+      using A::S;
+      struct S s;
+    }
+    namespace F {
+      typedef A::S S;
+    }
+
+    namespace G {
+      using namespace A;
+      using namespace F;
+      struct S s;
+    }
+    namespace H {
+      using namespace F;
+      using namespace A;
+      struct S s;
+    }
+  }
+}
Index: clang/test/CXX/drs/dr18xx.cpp
===================================================================
--- clang/test/CXX/drs/dr18xx.cpp
+++ clang/test/CXX/drs/dr18xx.cpp
@@ -168,3 +168,60 @@
   b = static_cast<B&&>(b); // expected-error {{copy assignment operator is implicitly deleted}}
 #endif
 }
+
+namespace dr1894 { // dr1894: 3.8
+                   // NB: reusing dr407 test
+  struct S;
+  typedef struct S S;
+  void f() {
+    struct S *p;
+    {
+      typedef struct S S; // #dr1894-typedef-S-S
+      struct S *p;
+      // expected-error@-1 {{typedef 'S' cannot be referenced with a struct specifier}}
+      // expected-note@#dr1894-typedef-S-S {{here}}
+    }
+  }
+  struct S {};
+
+  namespace UsingDir {
+    namespace A {
+      struct S {}; // #dr1894-struct-S
+    }
+    namespace B {
+      typedef int S; // #dr1894-typedef-int-S
+    }
+    namespace C {
+      using namespace A;
+      using namespace B;
+      struct S s;
+      // expected-error@-1 {{ambiguous}}
+      // expected-note@#dr1894-struct-S {{candidate}}
+      // expected-note@#dr1894-typedef-int-S {{candidate}}
+    }
+    namespace D {
+      using A::S;
+      typedef struct S S;
+      struct S s;
+    }
+    namespace E {
+      typedef A::S S;
+      using A::S;
+      struct S s;
+    }
+    namespace F {
+      typedef A::S S;
+    }
+
+    namespace G {
+      using namespace A;
+      using namespace F;
+      struct S s;
+    }
+    namespace H {
+      using namespace F;
+      using namespace A;
+      struct S s;
+    }
+  }
+}
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to