Skip to content

[clang] Cover CWG issues about export template #94876

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jun 21, 2024

Conversation

Endilll
Copy link
Contributor

@Endilll Endilll commented Jun 8, 2024

This PR covers the following Core issues:
CWG204 "Exported class templates"
CWG323 "Where must export appear?"
CWG335 "Allowing export on template members of nontemplate classes"
CWG820 "Deprecation of export"

I believe the list above is entirety of Core issues that are dedicated solely to export template.

I believe we have two main points of view here, which command what this PR should do:

  1. (easy) Removal of export template was done as a defect report in CWG820, and the rest are effectively superseded by it, because we apply defect reports retroactively.
  2. (harder) Those Core issues are testable individually, so we should test them for the behavior Core wanted at the time.

This PR implements the first option, making our C++ DR status page greener.
I think I can be persuaded to go with the second option, if reviewers have strong preference for it.

@llvmbot llvmbot added the clang Clang issues not falling into any other category label Jun 8, 2024
@llvmbot
Copy link
Member

llvmbot commented Jun 8, 2024

@llvm/pr-subscribers-clang

Author: Vlad Serebrennikov (Endilll)

Changes

This PR covers the following Core issues:
CWG204 "Exported class templates"
CWG323 "Where must export appear?"
CWG335 "Allowing export on template members of nontemplate classes"
CWG820 "Deprecation of export"

I believe the list above is entirety of Core issues that are dedicated solely to export template.

I believe we have two main points of view here, which command what this PR should do:

  1. (easy) Removal of export template was done as a defect report in CWG820, and the rest are effectively superseded by it, because we apply defect reports retroactively.
  2. (harder) Those Core issues are testable individually, so we should test them for the behavior Core wanted at the time.

This PR implements the first option, making our C++ DR status page greener.
I think I can be persuaded to go with the second option, if reviewers have strong preference for it.


Full diff: https://github.com/llvm/llvm-project/pull/94876.diff

4 Files Affected:

  • (modified) clang/test/CXX/drs/cwg2xx.cpp (+1-1)
  • (modified) clang/test/CXX/drs/cwg3xx.cpp (+2-2)
  • (modified) clang/test/CXX/drs/cwg8xx.cpp (+15-10)
  • (modified) clang/www/cxx_dr_status.html (+4-4)
diff --git a/clang/test/CXX/drs/cwg2xx.cpp b/clang/test/CXX/drs/cwg2xx.cpp
index 99916dea9a912..926cb19596026 100644
--- a/clang/test/CXX/drs/cwg2xx.cpp
+++ b/clang/test/CXX/drs/cwg2xx.cpp
@@ -41,7 +41,7 @@ namespace cwg202 { // cwg202: 3.1
   template struct X<f>;
 }
 
-// FIXME (export) cwg204: no
+// cwg204: sup 820
 
 namespace cwg206 { // cwg206: yes
   struct S; // #cwg206-S
diff --git a/clang/test/CXX/drs/cwg3xx.cpp b/clang/test/CXX/drs/cwg3xx.cpp
index 94227dc031c6a..a10ed95941ba4 100644
--- a/clang/test/CXX/drs/cwg3xx.cpp
+++ b/clang/test/CXX/drs/cwg3xx.cpp
@@ -377,7 +377,7 @@ namespace cwg322 { // cwg322: 2.8
   int &s = a;
 }
 
-// cwg323: no
+// cwg323: sup 820
 
 namespace cwg324 { // cwg324: 3.6
   struct S { int n : 1; } s; // #cwg324-n
@@ -587,7 +587,7 @@ namespace cwg334 { // cwg334: yes
   template void f<S>();
 }
 
-// cwg335: no
+// cwg335: sup 820
 
 namespace cwg336 { // cwg336: yes
   namespace Pre {
diff --git a/clang/test/CXX/drs/cwg8xx.cpp b/clang/test/CXX/drs/cwg8xx.cpp
index eba601300584d..c8cbdfcee3f4d 100644
--- a/clang/test/CXX/drs/cwg8xx.cpp
+++ b/clang/test/CXX/drs/cwg8xx.cpp
@@ -1,14 +1,19 @@
-// RUN: %clang_cc1 -std=c++98 -triple x86_64-unknown-unknown %s -verify=expected -fexceptions -fcxx-exceptions -pedantic-errors
-// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
-// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
-// RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
-// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
-// RUN: %clang_cc1 -std=c++23 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
-// RUN: %clang_cc1 -std=c++2c -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++98 -triple x86_64-unknown-unknown %s -verify=expected,cxx98-17 -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown %s -verify=expected,cxx98-17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown %s -verify=expected,cxx98-17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-unknown %s -verify=expected,cxx98-17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx20,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++23 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx20,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++2c -triple x86_64-unknown-unknown %s -verify=expected,since-cxx20,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
 
-#if __cplusplus == 199711L
-// expected-no-diagnostics
-#endif
+namespace cwg820 { // cwg820: 2.7
+export template <class T> struct B {};
+// cxx98-17-warning@-1 {{exported templates are unsupported}}
+// since-cxx20-error@-2 {{export declaration can only be used within a module purview}}
+export template<typename T> void f() {}
+// cxx98-17-warning@-1 {{exported templates are unsupported}}
+// since-cxx20-error@-2 {{export declaration can only be used within a module purview}}
+}
 
 namespace cwg873 { // cwg873: 3.0
 #if __cplusplus >= 201103L
diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html
index 5e2ab06701703..3fdf6bae0a3d5 100755
--- a/clang/www/cxx_dr_status.html
+++ b/clang/www/cxx_dr_status.html
@@ -1262,7 +1262,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/204.html">204</a></td>
     <td>CD1</td>
     <td>Exported class templates</td>
-    <td class="none" align="center">No</td>
+    <td class="full" align="center">Superseded by <a href="#820">820</a></td>
   </tr>
   <tr class="open" id="205">
     <td><a href="https://cplusplus.github.io/CWG/issues/205.html">205</a></td>
@@ -1978,7 +1978,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/323.html">323</a></td>
     <td>CD1</td>
     <td>Where must <TT>export</TT> appear?</td>
-    <td class="none" align="center">No</td>
+    <td class="full" align="center">Superseded by <a href="#820">820</a></td>
   </tr>
   <tr id="324">
     <td><a href="https://cplusplus.github.io/CWG/issues/324.html">324</a></td>
@@ -2050,7 +2050,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/335.html">335</a></td>
     <td>CD1</td>
     <td>Allowing <TT>export</TT> on template members of nontemplate classes</td>
-    <td class="none" align="center">No</td>
+    <td class="full" align="center">Superseded by <a href="#820">820</a></td>
   </tr>
   <tr id="336">
     <td><a href="https://cplusplus.github.io/CWG/issues/336.html">336</a></td>
@@ -4914,7 +4914,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
     <td><a href="https://cplusplus.github.io/CWG/issues/820.html">820</a></td>
     <td>CD2</td>
     <td>Deprecation of <TT>export</TT></td>
-    <td class="unknown" align="center">Unknown</td>
+    <td class="full" align="center">Clang 2.7</td>
   </tr>
   <tr id="822">
     <td><a href="https://cplusplus.github.io/CWG/issues/822.html">822</a></td>

@cor3ntin
Copy link
Contributor

cor3ntin commented Jun 9, 2024

I would prefer we say N/A rather than pretend we support something that was never implemented (to the extend i think it might be better to have an error about modules rather than exported templates in older language modes)

@Endilll
Copy link
Contributor Author

Endilll commented Jun 9, 2024

Using N/A for 204, 323, and 335 would be novel, because at the moment it's used for wording changes that do not affect implementations. Those Core issues clearly affected the implementations back when they were resolved.

@cor3ntin
Copy link
Contributor

cor3ntin commented Jun 9, 2024

We never implemented export template - and no one did, therefore we are not affected by changes to it (no one did except for EDG, i don't even know if they shipped it)

It is perfectly reasonable not to have tests whatsoever for that either (although I find the pre-c++20 diagnostic funny, we would be better of saying that modules are a c++20 feature).

@Endilll
Copy link
Contributor Author

Endilll commented Jun 9, 2024

We never implemented export template - and no one did, therefore we are not affected by changes to it (no one did except for EDG, i don't even know if they shipped it)

When I said "wording changes that do not affect implementations", I meant a hypothetical conforming implementation. In other words, N/A is for wording changes that can't be exhibited by writing programs and feeding them into the compiler.

@Endilll
Copy link
Contributor Author

Endilll commented Jun 10, 2024

Me and Corentin discussed this offline. Two points emerged there:

  1. He's more concerned with the fact that 204 and other Core issues are highlighted green, inheriting the status of the issue that superseded them, than with the fact that they are marked as superseded. Styles we use in cxx_dr_status.html can be changed in a subsequent PR (to e.g. use N/A style for superseded issues).
  2. In previous discussions on this topic, I remember that we together with @AaronBallman agreed that statuses on our page should follow the official statuses. This PR goes against it, because I know from experience that the current CWG chair is not interested in revisiting Core issues that were closed long ago, and mark them as superseded where appropriate. We might need to revisit out previous consensus in the light of this PR and aforementioned experience talking to Core.

@AaronBallman
Copy link
Collaborator

The goal of the status page is to convey implementation status to our users, and so from that perspective I think N/A provides the least information to users because it basically says "this entry doesn't apply to us". So in these kinds of cases, sup conveys more information because the DRs would apply to us, except another DR superseded the need for making the changes.

In terms of the color used, we want green to mean "we're behaving in a conforming way" so users can tell at a glance where the edge cases are. This case is a bit weird because "conform" means we don't implement something rather than we do implement it, but I still think green is appropriate because we're following the standard. It might be fine to give a different color to superseded, but I would guess we'd want that to be a lighter form version of whatever the superseding issue is colored. e.g., given that conforming = green and non-conforming = red, if we have a superseded issue we conform to, it would be light green, and if we didn't conform it would be pink. WDYT?

@Endilll
Copy link
Contributor Author

Endilll commented Jun 11, 2024

Thank you for chiming in!

It might be fine to give a different color to superseded, but I would guess we'd want that to be a lighter form version of whatever the superseding issue is colored. e.g., given that conforming = green and non-conforming = red, if we have a superseded issue we conform to, it would be light green, and if we didn't conform it would be pink. WDYT?

I'm thinking of reducing opacity of the color instead of picking exact shades, but yeah, we can definitely do something of this sort.

Copy link
Collaborator

@shafik shafik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM after addressing coloring issues.

Endilll added a commit that referenced this pull request Jun 20, 2024
This patch changes how superseded issues inherit the color of the issues
that superseded them. Now they reduce the opacity of the color from 1.0
to 0.65, to make them distinguishable. This was requested during the
review of #94876.

That's how it's going to look:

![a1rYVHQ](https://github.com/llvm/llvm-project/assets/12883766/00e624c0-accb-4440-9f9b-4089a157aab2)
Copy link
Contributor

@cor3ntin cor3ntin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think as a follow up we should get rid of the "exported templates are unsupported" warning which makes no sense whatsoever and either use the c++20 error in all language modes or just a generic "unexpected 'export' keyword here" diagnostic

@Endilll Endilll merged commit aed9891 into llvm:main Jun 21, 2024
7 checks passed
@Endilll Endilll deleted the cwg-export-template branch June 21, 2024 09:49
AlexisPerry pushed a commit to llvm-project-tlp/llvm-project that referenced this pull request Jul 9, 2024
…#96051)

This patch changes how superseded issues inherit the color of the issues
that superseded them. Now they reduce the opacity of the color from 1.0
to 0.65, to make them distinguishable. This was requested during the
review of llvm#94876.

That's how it's going to look:

![a1rYVHQ](https://github.com/llvm/llvm-project/assets/12883766/00e624c0-accb-4440-9f9b-4089a157aab2)
AlexisPerry pushed a commit to llvm-project-tlp/llvm-project that referenced this pull request Jul 9, 2024
This PR covers the following Core issues:
[CWG204](https://cplusplus.github.io/CWG/issues/204.html) "Exported
class templates"
[CWG323](https://cplusplus.github.io/CWG/issues/323.html) "Where must
`export` appear?"
[CWG335](https://cplusplus.github.io/CWG/issues/335.html) "Allowing
`export` on template members of nontemplate classes"
[CWG820](https://cplusplus.github.io/CWG/issues/820.html) "Deprecation
of `export`"

I believe the list above is entirety of Core issues that are dedicated
solely to `export template`.

I believe we have two main points of view here, which command what this
PR should do:
1. (easy) Removal of `export template` was done as a defect report in
CWG820, and the rest are effectively superseded by it, because we apply
defect reports retroactively.
2. (harder) Those Core issues are testable individually, so we should
test them for the behavior Core wanted at the time.

This PR implements the first option, making our C++ DR status page
greener.
I think I can be persuaded to go with the second option, if reviewers
have strong preference for it.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
c++ clang Clang issues not falling into any other category test-suite
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants