-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[Clang] Add test for CWG2285 "Issues with structured bindings" #126421
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
Conversation
|
@llvm/pr-subscribers-clang Author: Yanzuo Liu (zwuis) ChangesThe resolution of CWG2285 adds the point of declaration of a structured binding, and was implemented in bdb84f3 . Drive-by changes: modify comment mentioned in CWG2285. Full diff: https://github.com/llvm/llvm-project/pull/126421.diff 3 Files Affected:
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 0cf02fe6407c24c..7cc67598e4c819f 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -733,8 +733,11 @@ Sema::ActOnDecompositionDeclarator(Scope *S, Declarator &D,
}
if (!TemplateParamLists.empty()) {
- // FIXME: There's no rule against this, but there are also no rules that
- // would actually make it usable, so we reject it for now.
+ // C++17 [temp]/1:
+ // A template defines a family of class, functions, or variables, or an
+ // alias for a family of types.
+ //
+ // Structured bindings are not included.
Diag(TemplateParamLists.front()->getTemplateLoc(),
diag::err_decomp_decl_template);
return nullptr;
diff --git a/clang/test/CXX/drs/cwg22xx.cpp b/clang/test/CXX/drs/cwg22xx.cpp
index d93070ef3804dd9..62988e35b963741 100644
--- a/clang/test/CXX/drs/cwg22xx.cpp
+++ b/clang/test/CXX/drs/cwg22xx.cpp
@@ -1,10 +1,10 @@
// 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++17 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++23 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++2c -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors
namespace cwg2211 { // cwg2211: 8
@@ -196,6 +196,16 @@ void g() {
#endif
} // namespace cwg2277
+namespace cwg2285 { // cwg2285: 4
+#if __cplusplus >= 201703L
+ void test() {
+ using T = int[1];
+ auto [a] = T{a};
+ // since-cxx17-error@-1 {{binding 'a' cannot appear in the initializer of its own decomposition declaration}}
+ }
+#endif
+} // namespace cwg2285
+
namespace cwg2292 { // cwg2292: 9
#if __cplusplus >= 201103L
template<typename T> using id = T;
diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html
index 69ddd5e58b921a8..3fae1c6c6a0620d 100755
--- a/clang/www/cxx_dr_status.html
+++ b/clang/www/cxx_dr_status.html
@@ -13537,7 +13537,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
<td><a href="https://cplusplus.github.io/CWG/issues/2285.html">2285</a></td>
<td>CD5</td>
<td>Issues with structured bindings</td>
- <td class="unknown" align="center">Unknown</td>
+ <td class="full" align="center">Clang 4</td>
</tr>
<tr id="2286">
<td><a href="https://cplusplus.github.io/CWG/issues/2286.html">2286</a></td>
|
| #endif | ||
| } // namespace cwg2277 | ||
|
|
||
| namespace cwg2285 { // cwg2285: 4 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems that Clang 5 was the first release which exhibits the correct behavior: https://godbolt.org/z/qabGrdvPq
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems that Clang 5 was the first release which exhibits the correct behavior: https://godbolt.org/z/qabGrdvPq
-std=c++1z set __cplusplus to 201406L in Clang 4. It was changed to 201703L in 4b0cad0 (Clang 5). We need to remove the #if condition to test corresponding behaviour in Clang 4.
Do I need to add this note in test file?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're right, Clang 4 behaves as expected without #if __cplusplus.
Do I need to add this note in test file?
Yes, leave a comment somewhere that Clang 4 doesn't pass the test because of the wrong value of __cplusplus, even though it implements the DR.
cor3ntin
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
The resolution of CWG2285 adds the point of declaration of a structured binding, and was implemented in bdb84f3 .
Drive-by changes: modify comment and diagnostic messages mentioned in CWG2285.