Skip to content

[clang] Add test for CWG2149 "Brace elision and array length deduction" #90079

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 1 commit into from
Apr 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions clang/test/CXX/drs/cwg2149.cpp
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion clang/www/cxx_dr_status.html
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
Loading