[clang] df81055 - [clang] Do less advertising for unresolved issues in `cxx_dr_status.html` (#78836)

via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 15 11:46:00 PST 2024


Author: Vlad Serebrennikov
Date: 2024-02-15T23:45:56+04:00
New Revision: df81055955d564dccfd43a9faeb2f54c8c998f68

URL: https://github.com/llvm/llvm-project/commit/df81055955d564dccfd43a9faeb2f54c8c998f68
DIFF: https://github.com/llvm/llvm-project/commit/df81055955d564dccfd43a9faeb2f54c8c998f68.diff

LOG: [clang] Do less advertising for unresolved issues in `cxx_dr_status.html` (#78836)

This patch places additional requirement on tests for open issues to
specify what do they test, and reduce their advertising on
`cxx_dr_status.html`.

Tests for open issues have to either provide date of the proposed
resolution they test, or a paper number that attempts to resolve the
issue. Examples from this patch: `// dr1223: 17 drafting 2023-05-12`,
`// dr2049: 18 drafting P2308R1`, `// dr2335: no drafting 2018-06`.

Tests for open issues are no longer advertised in `cxx_dr_status.html`
as tests for resolved issues. Instead, they are specified as `Not
Resolved*` (note the asterisk). Such statuses have a tooltip with the
following kind of text:
`Clang 17 implements 2023-05-12 resolution`
`Clang does not implement 2018-06-04 resolution` 
`Clang 18 implements P2308R1 resolution`
I admit that the wording is a bit crude, but I tried to minimize amount
of boilerplate in the `make_cxx_dr_status`. Hopefully, this whole setup
matches [C++ compiler
support](https://en.cppreference.com/w/cpp/compiler_support) page on
cppreference enough for people to catch up.

This patch also implement a quality-of-life feature for users of
`make_cxx_dr_status`: now script is able to report multiple bad `// dr`
comments in a single run.

This has also been discussed in a PR for CWG472 test:
https://github.com/llvm/llvm-project/pull/67948

Added: 
    

Modified: 
    clang/test/CXX/drs/dr12xx.cpp
    clang/test/CXX/drs/dr18xx.cpp
    clang/test/CXX/drs/dr20xx.cpp
    clang/test/CXX/drs/dr2335.cpp
    clang/test/CXX/drs/dr24xx.cpp
    clang/test/CXX/drs/dr25xx.cpp
    clang/test/CXX/drs/dr4xx.cpp
    clang/www/cxx_dr_status.html
    clang/www/make_cxx_dr_status

Removed: 
    


################################################################################
diff  --git a/clang/test/CXX/drs/dr12xx.cpp b/clang/test/CXX/drs/dr12xx.cpp
index cb4cc5aef17371..da5dd02a00677c 100644
--- a/clang/test/CXX/drs/dr12xx.cpp
+++ b/clang/test/CXX/drs/dr12xx.cpp
@@ -32,7 +32,7 @@ namespace dr1213 { // dr1213: 7
 }
 
 #if __cplusplus >= 201103L
-namespace dr1223 { // dr1223: 17 drafting
+namespace dr1223 { // dr1223: 17 drafting 2023-05-12
 struct M;
 template <typename T>
 struct V;

diff  --git a/clang/test/CXX/drs/dr18xx.cpp b/clang/test/CXX/drs/dr18xx.cpp
index 37ea450137ac5e..a7cee4ef8902f9 100644
--- a/clang/test/CXX/drs/dr18xx.cpp
+++ b/clang/test/CXX/drs/dr18xx.cpp
@@ -366,7 +366,7 @@ namespace dr1881 { // dr1881: 7
   static_assert(!__is_standard_layout(D), "");
 }
 
-namespace dr1890 { // dr1890: no drafting
+namespace dr1890 { // dr1890: no drafting 2018-06-04
 // FIXME: current consensus for CWG2335 is that the examples are well-formed.
 namespace ex1 {
 #if __cplusplus >= 201402L

diff  --git a/clang/test/CXX/drs/dr20xx.cpp b/clang/test/CXX/drs/dr20xx.cpp
index f7f37379e61ad1..96f2572cfb524d 100644
--- a/clang/test/CXX/drs/dr20xx.cpp
+++ b/clang/test/CXX/drs/dr20xx.cpp
@@ -90,7 +90,7 @@ namespace dr2026 { // dr2026: 11
   }
 }
 
-namespace dr2049 { // dr2049: 18 drafting
+namespace dr2049 { // dr2049: 18 drafting P2308R1
 #if __cplusplus >= 202302L
 template <int* x = {}> struct X {};
 X<> a;

diff  --git a/clang/test/CXX/drs/dr2335.cpp b/clang/test/CXX/drs/dr2335.cpp
index d143aaf7cb0ac0..33eebb2c4a5c57 100644
--- a/clang/test/CXX/drs/dr2335.cpp
+++ b/clang/test/CXX/drs/dr2335.cpp
@@ -10,7 +10,7 @@
 // expected-no-diagnostics
 #endif
 
-namespace dr2335 { // dr2335: no drafting
+namespace dr2335 { // dr2335: no drafting 2018-06
 // FIXME: current consensus is that the examples are well-formed.
 #if __cplusplus >= 201402L
 namespace ex1 {

diff  --git a/clang/test/CXX/drs/dr24xx.cpp b/clang/test/CXX/drs/dr24xx.cpp
index 66e9cf5a677f80..ae8dda3351f48e 100644
--- a/clang/test/CXX/drs/dr24xx.cpp
+++ b/clang/test/CXX/drs/dr24xx.cpp
@@ -45,7 +45,7 @@ void fallthrough(int n) {
 #endif
 }
 
-namespace dr2450 { // dr2450: 18 review
+namespace dr2450 { // dr2450: 18 review P2308R1
 #if __cplusplus >= 202302L
 struct S {int a;};
 template <S s>
@@ -59,7 +59,7 @@ f<{.a= 0}>();
 #endif
 }
 
-namespace dr2459 { // dr2459: 18 drafting
+namespace dr2459 { // dr2459: 18 drafting P2308R1
 #if __cplusplus >= 202302L
 struct A {
   constexpr A(float) {}

diff  --git a/clang/test/CXX/drs/dr25xx.cpp b/clang/test/CXX/drs/dr25xx.cpp
index b1e54804fc895c..9fc7cf59485caa 100644
--- a/clang/test/CXX/drs/dr25xx.cpp
+++ b/clang/test/CXX/drs/dr25xx.cpp
@@ -85,7 +85,7 @@ using ::dr2521::operator""_div;
 
 
 #if __cplusplus >= 202302L
-namespace dr2553 { // dr2553: 18 review
+namespace dr2553 { // dr2553: 18 review 2023-07-14
 struct B {
   virtual void f(this B&); 
   // since-cxx23-error at -1 {{an explicit object parameter cannot appear in a virtual function}}
@@ -103,7 +103,7 @@ struct D : B {
 #endif
 
 #if __cplusplus >= 202302L
-namespace dr2554 { // dr2554: 18 review
+namespace dr2554 { // dr2554: 18 review 2021-12-10
 struct B {
   virtual void f(); // #dr2554-g
 };
@@ -130,7 +130,7 @@ struct D3 : B {
 #endif
 
 #if __cplusplus >= 202302L
-namespace dr2561 { // dr2561: 18 review
+namespace dr2561 { // dr2561: 18 review 2023-11-09
 struct C {
     constexpr C(auto) { }
 };
@@ -145,7 +145,7 @@ void foo() {
 #endif
 
 
-namespace dr2565 { // dr2565: 16 open
+namespace dr2565 { // dr2565: 16 open 2023-06-07
 #if __cplusplus >= 202002L
   template<typename T>
     concept C = requires (typename T::type x) {

diff  --git a/clang/test/CXX/drs/dr4xx.cpp b/clang/test/CXX/drs/dr4xx.cpp
index 2f11c92f86aca3..612a152aec4c4d 100644
--- a/clang/test/CXX/drs/dr4xx.cpp
+++ b/clang/test/CXX/drs/dr4xx.cpp
@@ -1055,7 +1055,7 @@ namespace dr471 { // dr471: 2.8
   //   expected-note@#dr471-G-using {{declared private here}}
 }
 
-namespace dr472 { // dr472: no drafting
+namespace dr472 { // dr472: no drafting 2011-04
 struct B {
   int i; // #dr472-i
 };

diff  --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html
index 1e527e1d1736e3..e9b18b1e283e66 100755
--- a/clang/www/cxx_dr_status.html
+++ b/clang/www/cxx_dr_status.html
@@ -2872,7 +2872,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/472.html">472</a></td>
     <td>drafting</td>
     <td>Casting across protected inheritance</td>
-    <td class="none" align="center">No</td>
+    <td title="Clang does not implement 2011-04 resolution" align="center">Not Resolved*</td>
   </tr>
   <tr id="473">
     <td><a href="https://cplusplus.github.io/CWG/issues/473.html">473</a></td>
@@ -7146,7 +7146,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/1223.html">1223</a></td>
     <td>drafting</td>
     <td>Syntactic disambiguation and <I>trailing-return-type</I>s</td>
-    <td class="full" align="center">Clang 17</td>
+    <td title="Clang 17 implements 2023-05-12 resolution" align="center">Not Resolved*</td>
   </tr>
   <tr id="1224">
     <td><a href="https://cplusplus.github.io/CWG/issues/1224.html">1224</a></td>
@@ -11148,7 +11148,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/1890.html">1890</a></td>
     <td>drafting</td>
     <td>Member type depending on definition of member function</td>
-    <td class="none" align="center">No</td>
+    <td title="Clang does not implement 2018-06-04 resolution" align="center">Not Resolved*</td>
   </tr>
   <tr id="1891">
     <td><a href="https://cplusplus.github.io/CWG/issues/1891.html">1891</a></td>
@@ -12102,7 +12102,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/2049.html">2049</a></td>
     <td>drafting</td>
     <td>List initializer in non-type template default argument</td>
-    <td class="unreleased" align="center">Clang 18</td>
+    <td title="Clang 18 implements P2308R1 resolution" align="center">Not Resolved*</td>
   </tr>
   <tr id="2050">
     <td><a href="https://cplusplus.github.io/CWG/issues/2050.html">2050</a></td>
@@ -13818,7 +13818,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/2335.html">2335</a></td>
     <td>drafting</td>
     <td>Deduced return types vs member types</td>
-    <td class="none" align="center">No</td>
+    <td title="Clang does not implement 2018-06 resolution" align="center">Not Resolved*</td>
   </tr>
   <tr id="2336">
     <td><a href="https://cplusplus.github.io/CWG/issues/2336.html">2336</a></td>
@@ -13986,7 +13986,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/2363.html">2363</a></td>
     <td>NAD</td>
     <td>Opaque enumeration friend declarations</td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="2364">
     <td><a href="https://cplusplus.github.io/CWG/issues/2364.html">2364</a></td>
@@ -14508,7 +14508,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/2450.html">2450</a></td>
     <td>review</td>
     <td><I>braced-init-list</I> as a <I>template-argument</I></td>
-    <td class="unreleased" align="center">Clang 18</td>
+    <td title="Clang 18 implements P2308R1 resolution" align="center">Not Resolved*</td>
   </tr>
   <tr id="2451">
     <td><a href="https://cplusplus.github.io/CWG/issues/2451.html">2451</a></td>
@@ -14562,7 +14562,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/2459.html">2459</a></td>
     <td>drafting</td>
     <td>Template parameter initialization</td>
-    <td class="unreleased" align="center">Clang 18</td>
+    <td title="Clang 18 implements P2308R1 resolution" align="center">Not Resolved*</td>
   </tr>
   <tr id="2460">
     <td><a href="https://cplusplus.github.io/CWG/issues/2460.html">2460</a></td>
@@ -15126,13 +15126,13 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/2553.html">2553</a></td>
     <td>review</td>
     <td>Restrictions on explicit object member functions</td>
-    <td class="unreleased" align="center">Clang 18</td>
+    <td title="Clang 18 implements 2023-07-14 resolution" align="center">Not Resolved*</td>
   </tr>
   <tr class="open" id="2554">
     <td><a href="https://cplusplus.github.io/CWG/issues/2554.html">2554</a></td>
     <td>review</td>
     <td>Overriding virtual functions, also with explicit object parameters</td>
-    <td class="unreleased" align="center">Clang 18</td>
+    <td title="Clang 18 implements 2021-12-10 resolution" align="center">Not Resolved*</td>
   </tr>
   <tr class="open" id="2555">
     <td><a href="https://cplusplus.github.io/CWG/issues/2555.html">2555</a></td>
@@ -15174,7 +15174,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/2561.html">2561</a></td>
     <td>review</td>
     <td>Conversion to function pointer for lambda with explicit object parameter</td>
-    <td class="unreleased" align="center">Clang 18</td>
+    <td title="Clang 18 implements 2023-11-09 resolution" align="center">Not Resolved*</td>
   </tr>
   <tr class="open" id="2562">
     <td><a href="https://cplusplus.github.io/CWG/issues/2562.html">2562</a></td>
@@ -15198,7 +15198,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/2565.html">2565</a></td>
     <td>open</td>
     <td>Invalid types in the <I>parameter-declaration-clause</I> of a <I>requires-expression</I></td>
-    <td class="full" align="center">Clang 16</td>
+    <td title="Clang 16 implements 2023-06-07 resolution" align="center">Not Resolved*</td>
   </tr>
   <tr class="open" id="2566">
     <td><a href="https://cplusplus.github.io/CWG/issues/2566.html">2566</a></td>

diff  --git a/clang/www/make_cxx_dr_status b/clang/www/make_cxx_dr_status
index b0898ac25b7220..38f847cdc1b7f9 100755
--- a/clang/www/make_cxx_dr_status
+++ b/clang/www/make_cxx_dr_status
@@ -129,19 +129,25 @@ out_file.write('''\
 
 latest_release = 17
 
+class AvailabilityError(RuntimeError):
+  pass
+
+availability_error_occurred = False
+
 def availability(issue):
   status = status_map.get(issue, 'unknown')
 
   unresolved_status = ''
-  if status.endswith(' open'):
-    status = status[:-5]
-    unresolved_status = 'open'
-  elif status.endswith(' drafting'):
-    status = status[:-9]
-    unresolved_status = 'drafting'
-  elif status.endswith(' review'):
-    status = status[:-7]
-    unresolved_status = 'review'
+  proposed_resolution = ''
+  unresolved_status_match = re.search(r' (open|drafting|review)', status)
+  if unresolved_status_match:
+    unresolved_status = unresolved_status_match.group(1)
+    proposed_resolution_match = re.search(r' (open|drafting|review) (\d{4}-\d{2}(?:-\d{2})?|P\d{4}R\d+)$', status)
+    if proposed_resolution_match is None:
+      raise AvailabilityError('Issue {}: \'{}\' status should be followed by a paper number (P1234R5) or proposed resolution in YYYY-MM-DD format'.format(dr.issue, unresolved_status))
+    proposed_resolution = proposed_resolution_match.group(2)
+    status = status[:-1-len(proposed_resolution)]
+    status = status[:-1-len(unresolved_status)]
 
   avail_suffix = ''
   if status.endswith(' c++11'):
@@ -159,21 +165,37 @@ def availability(issue):
   if status == 'unknown':
     avail = 'Unknown'
     avail_style = ' class="unknown"'
-  elif re.match('^[0-9]+\.?[0-9]*', status):
-    avail = 'Clang %s' % status
-    if float(status) > latest_release:
-      avail_style = ' class="unreleased"'
-    else:
-      avail_style = ' class="full"'
+  elif re.match(r'^[0-9]+\.?[0-9]*', status):
+    if not proposed_resolution:
+      avail = 'Clang %s' % status
+      if float(status) > latest_release:
+        avail_style = ' class="unreleased"'
+      else:
+        avail_style = ' class="full"'
+    else: 
+      avail = 'Not Resolved*'
+      avail_style = f' title="Clang {status} implements {proposed_resolution} resolution"'
   elif status == 'yes':
-    avail = 'Yes'
-    avail_style = ' class="full"'
+    if not proposed_resolution:
+      avail = 'Yes'
+      avail_style = ' class="full"'
+    else:
+      avail = 'Not Resolved*'
+      avail_style = f' title="Clang implements {proposed_resolution} resolution"'
   elif status == 'partial':
-    avail = 'Partial'
-    avail_style = ' class="partial"'
+    if not proposed_resolution:
+      avail = 'Partial'
+      avail_style = ' class="partial"'
+    else:
+      avail = 'Not Resolved*'
+      avail_style = f' title="Clang partially implements {proposed_resolution} resolution"'
   elif status == 'no':
-    avail = 'No'
-    avail_style = ' class="none"'
+    if not proposed_resolution:
+      avail = 'No'
+      avail_style = ' class="none"'
+    else:
+      avail = 'Not Resolved*'
+      avail_style = f' title="Clang does not implement {proposed_resolution} resolution"'
   elif status == 'na':
     avail = 'N/A'
     avail_style = ' class="na"'
@@ -200,7 +222,7 @@ def availability(issue):
     avail = 'Duplicate of <a href="#%s">%s</a>' % (dup, dup)
     _, avail_style, _ = availability(dup)
   else:
-    assert False, 'unknown status %s for issue %s' % (status, dr.issue)
+    raise AvailabilityError('Unknown status %s for issue %s' % (status, dr.issue))
   return (avail + avail_suffix, avail_style, unresolved_status)
 
 count = {}
@@ -217,20 +239,36 @@ for dr in drs:
 
   elif dr.status in ('open', 'drafting', 'review'):
     row_style = ' class="open"'
-    avail, avail_style, unresolved_status = availability(dr.issue)
+    try:
+      avail, avail_style, unresolved_status = availability(dr.issue)
+    except AvailabilityError as e:
+      availability_error_occurred = True
+      print(e.args[0])
+      continue
+      
     if avail == 'Unknown':
       avail = 'Not resolved'
       avail_style = ''
     else:
-      assert unresolved_status == dr.status, \
-             "Issue %s is marked '%s', which 
diff ers from CWG index status '%s'" \
-             % (dr.issue, unresolved_status, dr.status)
+      if unresolved_status != dr.status:
+        availability_error_occurred = True
+        print("Issue %s is marked '%s', which 
diff ers from CWG index status '%s'" \
+             % (dr.issue, unresolved_status, dr.status))
+        continue
   else:
     row_style = ''
-    avail, avail_style, unresolved_status = availability(dr.issue)
-    assert not unresolved_status, \
-           "Issue %s is marked '%s', even though it is resolved in CWG index" \
-           % (dr.issue, unresolved_status)
+    try:
+      avail, avail_style, unresolved_status = availability(dr.issue)
+    except AvailabilityError as e:
+      availability_error_occurred = True
+      print(e.args[0])
+      continue
+
+    if unresolved_status:
+      availability_error_occurred = True
+      print("Issue %s is marked '%s', even though it is resolved in CWG index" \
+           % (dr.issue, unresolved_status))
+      continue
 
   if not avail.startswith('Sup') and not avail.startswith('Dup'):
     count[avail] = count.get(avail, 0) + 1
@@ -243,6 +281,9 @@ for dr in drs:
     <td%s align="center">%s</td>
   </tr>''' % (row_style, dr.issue, dr.issue, dr.issue, dr.status, dr.title, avail_style, avail))
 
+if availability_error_occurred:
+  exit(1)
+
 for status, num in sorted(count.items()):
   print("%s: %s" % (status, num), file=sys.stderr)
 


        


More information about the cfe-commits mailing list