|
| 1 | +// 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 |
| 2 | +// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors |
| 3 | +// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors |
| 4 | +// RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors |
| 5 | +// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors |
| 6 | +// RUN: %clang_cc1 -std=c++23 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors |
| 7 | +// RUN: %clang_cc1 -std=c++2c -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors |
| 8 | + |
| 9 | +#if __cplusplus == 199711L |
| 10 | +#define static_assert(...) __extension__ _Static_assert(__VA_ARGS__) |
| 11 | +// cxx98-error@-1 {{variadic macros are a C99 feature}} |
| 12 | +#endif |
| 13 | + |
| 14 | +namespace cwg2149 { // cwg2149: 3.1 drafting 2024-04 |
| 15 | +#if __cplusplus <= 201103L |
| 16 | +struct X { int i, j, k; }; |
| 17 | +#else |
| 18 | +struct X { int i, j, k = 42; }; |
| 19 | +#endif |
| 20 | + |
| 21 | +template<int N> |
| 22 | +void f1(const X(&)[N]); // #cwg2149-f1 |
| 23 | + |
| 24 | +template<int N> |
| 25 | +void f2(const X(&)[N][2]); // #cwg2149-f2 |
| 26 | + |
| 27 | +void f() { |
| 28 | + X a[] = { 1, 2, 3, 4, 5, 6 }; |
| 29 | + static_assert(sizeof(a) / sizeof(X) == 2, ""); |
| 30 | + X b[2] = { { 1, 2, 3 }, { 4, 5, 6 } }; |
| 31 | + X c[][2] = { 1, 2, 3, 4, 5, 6 }; |
| 32 | + static_assert(sizeof(c) / sizeof(X[2]) == 1, ""); |
| 33 | + |
| 34 | + #if __cplusplus >= 201103L |
| 35 | + constexpr X ca[] = { 1, 2, 3, 4, 5, 6 }; |
| 36 | + constexpr X cb[2] = { { 1, 2, 3 }, { 4, 5, 6 } }; |
| 37 | + static_assert(ca[0].i == cb[0].i, ""); |
| 38 | + static_assert(ca[0].j == cb[0].j, ""); |
| 39 | + static_assert(ca[0].k == cb[0].k, ""); |
| 40 | + static_assert(ca[1].i == cb[1].i, ""); |
| 41 | + static_assert(ca[1].j == cb[1].j, ""); |
| 42 | + static_assert(ca[1].k == cb[1].k, ""); |
| 43 | + |
| 44 | + f1({ 1, 2, 3, 4, 5, 6 }); |
| 45 | + // since-cxx11-error@-1 {{no matching function for call to 'f1'}} |
| 46 | + // since-cxx11-note@#cwg2149-f1 {{candidate function [with N = 6] not viable: no known conversion from 'int' to 'const X' for 1st argument}} |
| 47 | + f2({ 1, 2, 3, 4, 5, 6 }); |
| 48 | + // since-cxx11-error@-1 {{no matching function for call to 'f2'}} |
| 49 | + // since-cxx11-note@#cwg2149-f2 {{candidate function [with N = 6] not viable: no known conversion from 'int' to 'const X[2]' for 1st argument}} |
| 50 | + #endif |
| 51 | +} |
| 52 | +} // namespace cwg2149 |
| 53 | + |
| 54 | +// Constant evaluation is not powerful enough in 98 mode to check for equality |
| 55 | +// via static_assert, even with constant folding enabled. |
| 56 | + |
| 57 | +// CXX98: VarDecl {{.+}} a 'X[2]' |
| 58 | +// CXX98-NEXT: `-InitListExpr {{.+}} 'X[2]' |
| 59 | +// CXX98-NEXT: |-InitListExpr {{.+}} 'X':'cwg2149::X' |
| 60 | +// CXX98-NEXT: | |-IntegerLiteral {{.+}} 'int' 1 |
| 61 | +// CXX98-NEXT: | |-IntegerLiteral {{.+}} 'int' 2 |
| 62 | +// CXX98-NEXT: | `-IntegerLiteral {{.+}} 'int' 3 |
| 63 | +// CXX98-NEXT: `-InitListExpr {{.+}} 'X':'cwg2149::X' |
| 64 | +// CXX98-NEXT: |-IntegerLiteral {{.+}} 'int' 4 |
| 65 | +// CXX98-NEXT: |-IntegerLiteral {{.+}} 'int' 5 |
| 66 | +// CXX98-NEXT: `-IntegerLiteral {{.+}} 'int' 6 |
| 67 | + |
| 68 | +// CXX98: VarDecl {{.+}} b 'X[2]' |
| 69 | +// CXX98-NEXT: `-InitListExpr {{.+}} 'X[2]' |
| 70 | +// CXX98-NEXT: |-InitListExpr {{.+}} 'X':'cwg2149::X' |
| 71 | +// CXX98-NEXT: | |-IntegerLiteral {{.+}} 'int' 1 |
| 72 | +// CXX98-NEXT: | |-IntegerLiteral {{.+}} 'int' 2 |
| 73 | +// CXX98-NEXT: | `-IntegerLiteral {{.+}} 'int' 3 |
| 74 | +// CXX98-NEXT: `-InitListExpr {{.+}} 'X':'cwg2149::X' |
| 75 | +// CXX98-NEXT: |-IntegerLiteral {{.+}} 'int' 4 |
| 76 | +// CXX98-NEXT: |-IntegerLiteral {{.+}} 'int' 5 |
| 77 | +// CXX98-NEXT: `-IntegerLiteral {{.+}} 'int' 6 |
0 commit comments