Skip to content

Commit

Permalink
[clang] Add test for CWG2149 "Brace elision and array length deductio…
Browse files Browse the repository at this point in the history
…n" (#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.
  • Loading branch information
Endilll committed Apr 26, 2024
1 parent 950b7ce commit 1728a56
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 1 deletion.
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

0 comments on commit 1728a56

Please sign in to comment.