Author: Vlad Serebrennikov Date: 2024-04-26T18:33:58+04:00 New Revision: 1728a56d0e66c9e64a2e62fa6c5508580ccd28a0
URL: https://github.com/llvm/llvm-project/commit/1728a56d0e66c9e64a2e62fa6c5508580ccd28a0 DIFF: https://github.com/llvm/llvm-project/commit/1728a56d0e66c9e64a2e62fa6c5508580ccd28a0.diff LOG: [clang] Add test for CWG2149 "Brace elision and array length deduction" (#90079) This patch adds test for [CWG2149](https://cplusplus.github.io/CWG/issues/2149.html), following [P3106R1](https://wg21.link/p3106R1) "Clarifying rules for brace elision in aggregate initialization" and a clarification note on top of it added on April 2024. I haven't found a better way to check for equality of values inside array in 98 mode than to dump AST. I'm open to suggestions there. Added: clang/test/CXX/drs/cwg2149.cpp Modified: clang/www/cxx_dr_status.html Removed: ################################################################################ diff --git a/clang/test/CXX/drs/cwg2149.cpp b/clang/test/CXX/drs/cwg2149.cpp new file mode 100644 index 00000000000000..d0f8cb2dfc0a93 --- /dev/null +++ b/clang/test/CXX/drs/cwg2149.cpp @@ -0,0 +1,77 @@ +// RUN: %clang_cc1 -std=c++98 -triple x86_64-unknown-unknown %s -verify=expected,cxx98 -fexceptions -fcxx-exceptions -pedantic-errors -ast-dump | FileCheck %s --check-prefixes CXX98 +// 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 + +#if __cplusplus == 199711L +#define static_assert(...) __extension__ _Static_assert(__VA_ARGS__) +// cxx98-error@-1 {{variadic macros are a C99 feature}} +#endif + +namespace cwg2149 { // cwg2149: 3.1 drafting 2024-04 +#if __cplusplus <= 201103L +struct X { int i, j, k; }; +#else +struct X { int i, j, k = 42; }; +#endif + +template<int N> +void f1(const X(&)[N]); // #cwg2149-f1 + +template<int N> +void f2(const X(&)[N][2]); // #cwg2149-f2 + +void f() { + X a[] = { 1, 2, 3, 4, 5, 6 }; + static_assert(sizeof(a) / sizeof(X) == 2, ""); + X b[2] = { { 1, 2, 3 }, { 4, 5, 6 } }; + X c[][2] = { 1, 2, 3, 4, 5, 6 }; + static_assert(sizeof(c) / sizeof(X[2]) == 1, ""); + + #if __cplusplus >= 201103L + constexpr X ca[] = { 1, 2, 3, 4, 5, 6 }; + constexpr X cb[2] = { { 1, 2, 3 }, { 4, 5, 6 } }; + static_assert(ca[0].i == cb[0].i, ""); + static_assert(ca[0].j == cb[0].j, ""); + static_assert(ca[0].k == cb[0].k, ""); + static_assert(ca[1].i == cb[1].i, ""); + static_assert(ca[1].j == cb[1].j, ""); + static_assert(ca[1].k == cb[1].k, ""); + + f1({ 1, 2, 3, 4, 5, 6 }); + // since-cxx11-error@-1 {{no matching function for call to 'f1'}} + // since-cxx11-note@#cwg2149-f1 {{candidate function [with N = 6] not viable: no known conversion from 'int' to 'const X' for 1st argument}} + f2({ 1, 2, 3, 4, 5, 6 }); + // since-cxx11-error@-1 {{no matching function for call to 'f2'}} + // since-cxx11-note@#cwg2149-f2 {{candidate function [with N = 6] not viable: no known conversion from 'int' to 'const X[2]' for 1st argument}} + #endif +} +} // namespace cwg2149 + +// Constant evaluation is not powerful enough in 98 mode to check for equality +// via static_assert, even with constant folding enabled. + +// CXX98: VarDecl {{.+}} a 'X[2]' +// CXX98-NEXT: `-InitListExpr {{.+}} 'X[2]' +// CXX98-NEXT: |-InitListExpr {{.+}} 'X':'cwg2149::X' +// CXX98-NEXT: | |-IntegerLiteral {{.+}} 'int' 1 +// CXX98-NEXT: | |-IntegerLiteral {{.+}} 'int' 2 +// CXX98-NEXT: | `-IntegerLiteral {{.+}} 'int' 3 +// CXX98-NEXT: `-InitListExpr {{.+}} 'X':'cwg2149::X' +// CXX98-NEXT: |-IntegerLiteral {{.+}} 'int' 4 +// CXX98-NEXT: |-IntegerLiteral {{.+}} 'int' 5 +// CXX98-NEXT: `-IntegerLiteral {{.+}} 'int' 6 + +// CXX98: VarDecl {{.+}} b 'X[2]' +// CXX98-NEXT: `-InitListExpr {{.+}} 'X[2]' +// CXX98-NEXT: |-InitListExpr {{.+}} 'X':'cwg2149::X' +// CXX98-NEXT: | |-IntegerLiteral {{.+}} 'int' 1 +// CXX98-NEXT: | |-IntegerLiteral {{.+}} 'int' 2 +// CXX98-NEXT: | `-IntegerLiteral {{.+}} 'int' 3 +// CXX98-NEXT: `-InitListExpr {{.+}} 'X':'cwg2149::X' +// CXX98-NEXT: |-IntegerLiteral {{.+}} 'int' 4 +// CXX98-NEXT: |-IntegerLiteral {{.+}} 'int' 5 +// CXX98-NEXT: `-IntegerLiteral {{.+}} 'int' 6 diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html index 83b71e7c122d1e..ea8872c91be604 100755 --- a/clang/www/cxx_dr_status.html +++ b/clang/www/cxx_dr_status.html @@ -12702,7 +12702,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2> <td><a href="https://cplusplus.github.io/CWG/issues/2149.html">2149</a></td> <td>drafting</td> <td>Brace elision and array length deduction</td> - <td align="center">Not resolved</td> + <td title="Clang 3.1 implements 2024-04 resolution" align="center">Not Resolved*</td> </tr> <tr id="2150"> <td><a href="https://cplusplus.github.io/CWG/issues/2150.html">2150</a></td> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits