Skip to content

Commit 9e0aff5

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merged main:feb7b1914d51 into amd-gfx:e2e3938ffce3
Local branch amd-gfx e2e3938 Merged main:ea7157ff4f58 into amd-gfx:d7036c5ed4aa Remote branch main feb7b19 [clang-analysis]Fix false positive in mutation check when using pointer to member function (llvm#66846)
2 parents e2e3938 + feb7b19 commit 9e0aff5

File tree

37 files changed

+232
-83
lines changed

37 files changed

+232
-83
lines changed

clang-tools-extra/docs/ReleaseNotes.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ Changes in existing checks
246246
customizable namespace. This further allows for testing the libc when the
247247
system-libc is also LLVM's libc.
248248

249+
- Improved :doc:`misc-const-correctness
250+
<clang-tidy/checks/misc/const-correctness>` check to avoid false positive when
251+
using pointer to member function.
252+
249253
- Improved :doc:`misc-include-cleaner
250254
<clang-tidy/checks/misc/include-cleaner>` check by adding option
251255
`DeduplicateFindings` to output one finding per symbol occurrence.

clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-values.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -976,3 +976,16 @@ void auto_usage_variants() {
976976
auto &auto_td1 = auto_td0;
977977
auto *auto_td2 = &auto_td0;
978978
}
979+
980+
using PointerToMemberFunction = int (Value::*)();
981+
void member_pointer(Value &x, PointerToMemberFunction m) {
982+
Value &member_pointer_tmp = x;
983+
(member_pointer_tmp.*m)();
984+
}
985+
986+
using PointerToConstMemberFunction = int (Value::*)() const;
987+
void member_pointer_const(Value &x, PointerToConstMemberFunction m) {
988+
Value &member_pointer_tmp = x;
989+
// CHECK-MESSAGES:[[@LINE-1]]:3: warning: variable 'member_pointer_tmp' of type 'Value &' can be declared 'const'
990+
(member_pointer_tmp.*m)();
991+
}

clang/docs/ReleaseNotes.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,9 @@ Static Analyzer
502502
bitwise shift operators produce undefined behavior (because some operand is
503503
negative or too large).
504504

505+
- Fix false positive in mutation check when using pointer to member function.
506+
(`#66204: <https://github.com/llvm/llvm-project/issues/66204>`_).
507+
505508
- The ``alpha.security.taint.TaintPropagation`` checker no longer propagates
506509
taint on ``strlen`` and ``strnlen`` calls, unless these are marked
507510
explicitly propagators in the user-provided taint configuration file.

clang/lib/AST/ItaniumMangle.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -841,8 +841,17 @@ void CXXNameMangler::mangleFunctionEncoding(GlobalDecl GD) {
841841

842842
AbiTagList ReturnTypeAbiTags = makeFunctionReturnTypeTags(FD);
843843
if (ReturnTypeAbiTags.empty()) {
844-
// There are no tags for return type, the simplest case.
844+
// There are no tags for return type, the simplest case. Enter the function
845+
// parameter scope before mangling the name, because a template using
846+
// constrained `auto` can have references to its parameters within its
847+
// template argument list:
848+
//
849+
// template<typename T> void f(T x, C<decltype(x)> auto)
850+
// ... is mangled as ...
851+
// template<typename T, C<decltype(param 1)> U> void f(T, U)
852+
FunctionTypeDepthState Saved = FunctionTypeDepth.push();
845853
mangleName(GD);
854+
FunctionTypeDepth.pop(Saved);
846855
mangleFunctionEncodingBareType(FD);
847856
return;
848857
}
@@ -855,7 +864,10 @@ void CXXNameMangler::mangleFunctionEncoding(GlobalDecl GD) {
855864
CXXNameMangler FunctionEncodingMangler(*this, FunctionEncodingStream);
856865
// Output name of the function.
857866
FunctionEncodingMangler.disableDerivedAbiTags();
867+
868+
FunctionTypeDepthState Saved = FunctionTypeDepth.push();
858869
FunctionEncodingMangler.mangleNameWithAbiTags(FD, nullptr);
870+
FunctionTypeDepth.pop(Saved);
859871

860872
// Remember length of the function name in the buffer.
861873
size_t EncodingPositionStart = FunctionEncodingStream.str().size();
@@ -873,7 +885,9 @@ void CXXNameMangler::mangleFunctionEncoding(GlobalDecl GD) {
873885
AdditionalAbiTags.end());
874886

875887
// Output name with implicit tags and function encoding from temporary buffer.
888+
Saved = FunctionTypeDepth.push();
876889
mangleNameWithAbiTags(FD, &AdditionalAbiTags);
890+
FunctionTypeDepth.pop(Saved);
877891
Out << FunctionEncodingStream.str().substr(EncodingPositionStart);
878892

879893
// Function encoding could create new substitutions so we have to add

clang/lib/Analysis/ExprMutationAnalyzer.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,20 @@ AST_MATCHER(CXXTypeidExpr, isPotentiallyEvaluated) {
100100
return Node.isPotentiallyEvaluated();
101101
}
102102

103+
AST_MATCHER(CXXMemberCallExpr, isConstCallee) {
104+
const Decl *CalleeDecl = Node.getCalleeDecl();
105+
const auto *VD = dyn_cast_or_null<ValueDecl>(CalleeDecl);
106+
if (!VD)
107+
return false;
108+
const QualType T = VD->getType().getCanonicalType();
109+
const auto *MPT = dyn_cast<MemberPointerType>(T);
110+
const auto *FPT = MPT ? cast<FunctionProtoType>(MPT->getPointeeType())
111+
: dyn_cast<FunctionProtoType>(T);
112+
if (!FPT)
113+
return false;
114+
return FPT->isConst();
115+
}
116+
103117
AST_MATCHER_P(GenericSelectionExpr, hasControllingExpr,
104118
ast_matchers::internal::Matcher<Expr>, InnerMatcher) {
105119
if (Node.isTypePredicate())
@@ -274,8 +288,8 @@ const Stmt *ExprMutationAnalyzer::findDirectMutation(const Expr *Exp) {
274288
const auto NonConstMethod = cxxMethodDecl(unless(isConst()));
275289

276290
const auto AsNonConstThis = expr(anyOf(
277-
cxxMemberCallExpr(callee(NonConstMethod),
278-
on(canResolveToExpr(equalsNode(Exp)))),
291+
cxxMemberCallExpr(on(canResolveToExpr(equalsNode(Exp))),
292+
unless(isConstCallee())),
279293
cxxOperatorCallExpr(callee(NonConstMethod),
280294
hasArgument(0, canResolveToExpr(equalsNode(Exp)))),
281295
// In case of a templated type, calling overloaded operators is not
@@ -391,7 +405,9 @@ const Stmt *ExprMutationAnalyzer::findMemberMutation(const Expr *Exp) {
391405
match(findAll(expr(anyOf(memberExpr(hasObjectExpression(
392406
canResolveToExpr(equalsNode(Exp)))),
393407
cxxDependentScopeMemberExpr(hasObjectExpression(
394-
canResolveToExpr(equalsNode(Exp))))))
408+
canResolveToExpr(equalsNode(Exp)))),
409+
binaryOperator(hasOperatorName(".*"),
410+
hasLHS(equalsNode(Exp)))))
395411
.bind(NodeID<Expr>::value)),
396412
Stm, Context);
397413
return findExprMutation(MemberExprs);

clang/test/CodeGenCXX/mangle-concept.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %clang_cc1 -verify -frelaxed-template-template-args -std=c++20 -emit-llvm -triple %itanium_abi_triple -o - %s | FileCheck %s
1+
// RUN: %clang_cc1 -verify -frelaxed-template-template-args -std=c++20 -emit-llvm -triple %itanium_abi_triple -o - %s -fclang-abi-compat=latest | FileCheck %s
22
// RUN: %clang_cc1 -verify -frelaxed-template-template-args -std=c++20 -emit-llvm -triple %itanium_abi_triple -o - %s -fclang-abi-compat=16 | FileCheck %s --check-prefix=CLANG16
33
// expected-no-diagnostics
44

@@ -228,3 +228,15 @@ namespace gh67244 {
228228
// CHECK: define {{.*}} @_ZN7gh672441fITkNS_1CIifEEiEEvT_(
229229
template void f(int);
230230
}
231+
232+
namespace gh67356 {
233+
template<typename, typename T> concept C = true;
234+
template<typename T> void f(T t, C<decltype(t)> auto) {}
235+
// CHECK: define {{.*}} @_ZN7gh673561fIiTkNS_1CIDtfL0p_EEEiEEvT_T0_(
236+
template void f(int, int);
237+
238+
// Note, we use `fL0p` not `fp` above because:
239+
template<typename T> void g(T t, C<auto (T u) -> decltype(f(t, u))> auto) {}
240+
// CHECK: define {{.*}} @_ZN7gh673561gIiTkNS_1CIFDTcl1ffL0p_fp_EET_EEEiEEvS3_T0_(
241+
template void g(int, int);
242+
}

clang/test/CodeGenCXX/mangle-exprs.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s
1+
// RUN: %clang_cc1 -std=c++11 -fclang-abi-compat=latest -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s
22

33
namespace std {
44
typedef decltype(sizeof(int)) size_t;

clang/test/CodeGenCXX/mangle-nttp-anon-union.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// RUN: %clang_cc1 -std=c++20 -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s
2-
// RUN: %clang_cc1 -std=c++20 -emit-llvm %s -o - -triple=x86_64-linux-gnu | llvm-cxxfilt -n | FileCheck %s --check-prefix DEMANGLED
1+
// RUN: %clang_cc1 -std=c++20 -fclang-abi-compat=latest -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s
2+
// RUN: %clang_cc1 -std=c++20 -fclang-abi-compat=latest -emit-llvm %s -o - -triple=x86_64-linux-gnu | llvm-cxxfilt -n | FileCheck %s --check-prefix DEMANGLED
33

44
template<typename T>
55
struct wrapper1 {

clang/test/CodeGenCXX/mangle-requires.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %clang_cc1 -verify -std=c++2a -emit-llvm -triple %itanium_abi_triple -o - %s | FileCheck %s
1+
// RUN: %clang_cc1 -verify -std=c++2a -fclang-abi-compat=latest -emit-llvm -triple %itanium_abi_triple -o - %s | FileCheck %s
22
// expected-no-diagnostics
33

44
template <typename T, int N> concept SmallerThan = sizeof(T) < N;

clang/test/CodeGenCXX/mangle-template.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// RUN: %clang_cc1 -verify -Wno-return-type -Wno-main -std=c++11 -emit-llvm -triple %itanium_abi_triple -o - %s | FileCheck %s
2-
// RUN: %clang_cc1 -verify -Wno-return-type -Wno-main -std=c++20 -emit-llvm -triple x86_64-linux-gnu -o - %s | FileCheck %s --check-prefixes=CHECK,CXX20
1+
// RUN: %clang_cc1 -verify -Wno-return-type -Wno-main -std=c++11 -fclang-abi-compat=latest -emit-llvm -triple %itanium_abi_triple -o - %s | FileCheck %s
2+
// RUN: %clang_cc1 -verify -Wno-return-type -Wno-main -std=c++20 -fclang-abi-compat=latest -emit-llvm -triple x86_64-linux-gnu -o - %s | FileCheck %s --check-prefixes=CHECK,CXX20
33
// expected-no-diagnostics
44

55
namespace test1 {

clang/test/CodeGenCXX/matrix-type.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %clang_cc1 -no-enable-noundef-analysis -fenable-matrix -triple x86_64-apple-darwin %s -emit-llvm -disable-llvm-passes -o - -std=c++17 | FileCheck %s
1+
// RUN: %clang_cc1 -no-enable-noundef-analysis -fenable-matrix -fclang-abi-compat=latest -triple x86_64-apple-darwin %s -emit-llvm -disable-llvm-passes -o - -std=c++17 | FileCheck %s
22

33
typedef double dx5x5_t __attribute__((matrix_type(5, 5)));
44
typedef float fx3x4_t __attribute__((matrix_type(3, 4)));

clang/test/OpenMP/tile_codegen.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _
22
// Check code generation
3-
// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK1
3+
// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fclang-abi-compat=latest -fopenmp -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK1
44

55
// Check same results after serialization round-trip
6-
// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-pch -o %t %s
7-
// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -include-pch %t -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK2
6+
// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fclang-abi-compat=latest -fopenmp -emit-pch -o %t %s
7+
// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fclang-abi-compat=latest -fopenmp -include-pch %t -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK2
88
// expected-no-diagnostics
99

1010
#ifndef HEADER

clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,36 @@ TEST(ExprMutationAnalyzerTest, TypeDependentMemberCall) {
284284
EXPECT_THAT(mutatedBy(Results, AST.get()), ElementsAre("x.push_back(T())"));
285285
}
286286

287+
TEST(ExprMutationAnalyzerTest, MemberPointerMemberCall) {
288+
{
289+
const auto AST =
290+
buildASTFromCode("struct X {};"
291+
"using T = int (X::*)();"
292+
"void f(X &x, T m) { X &ref = x; (ref.*m)(); }");
293+
const auto Results =
294+
match(withEnclosingCompound(declRefTo("ref")), AST->getASTContext());
295+
EXPECT_THAT(mutatedBy(Results, AST.get()), ElementsAre("(ref .* m)()"));
296+
}
297+
{
298+
const auto AST =
299+
buildASTFromCode("struct X {};"
300+
"using T = int (X::*)();"
301+
"void f(X &x, T const m) { X &ref = x; (ref.*m)(); }");
302+
const auto Results =
303+
match(withEnclosingCompound(declRefTo("ref")), AST->getASTContext());
304+
EXPECT_THAT(mutatedBy(Results, AST.get()), ElementsAre("(ref .* m)()"));
305+
}
306+
{
307+
const auto AST =
308+
buildASTFromCode("struct X {};"
309+
"using T = int (X::*)() const;"
310+
"void f(X &x, T m) { X &ref = x; (ref.*m)(); }");
311+
const auto Results =
312+
match(withEnclosingCompound(declRefTo("ref")), AST->getASTContext());
313+
EXPECT_FALSE(isMutated(Results, AST.get()));
314+
}
315+
}
316+
287317
// Section: overloaded operators
288318

289319
TEST(ExprMutationAnalyzerTest, NonConstOperator) {

libc/src/stdio/scanf_core/vfscanf_internal.h

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ namespace internal {
2222

2323
#ifndef LIBC_COPT_STDIO_USE_SYSTEM_FILE
2424

25+
LIBC_INLINE void flockfile(FILE *f) {
26+
reinterpret_cast<__llvm_libc::File *>(f)->lock();
27+
}
28+
29+
LIBC_INLINE void funlockfile(FILE *f) {
30+
reinterpret_cast<__llvm_libc::File *>(f)->unlock();
31+
}
32+
2533
LIBC_INLINE int getc(void *f) {
2634
unsigned char c;
2735
auto result = reinterpret_cast<__llvm_libc::File *>(f)->read_unlocked(&c, 1);
@@ -33,7 +41,7 @@ LIBC_INLINE int getc(void *f) {
3341
}
3442

3543
LIBC_INLINE void ungetc(int c, void *f) {
36-
reinterpret_cast<__llvm_libc::File *>(f)->ungetc(c);
44+
reinterpret_cast<__llvm_libc::File *>(f)->ungetc_unlocked(c);
3745
}
3846

3947
LIBC_INLINE int ferror_unlocked(FILE *f) {
@@ -42,13 +50,19 @@ LIBC_INLINE int ferror_unlocked(FILE *f) {
4250

4351
#else // defined(LIBC_COPT_STDIO_USE_SYSTEM_FILE)
4452

53+
// Since ungetc_unlocked isn't always available, we don't acquire the lock for
54+
// system files.
55+
LIBC_INLINE void flockfile(::FILE *) { return; }
56+
57+
LIBC_INLINE void funlockfile(::FILE *) { return; }
58+
4559
LIBC_INLINE int getc(void *f) { return ::getc(reinterpret_cast<::FILE *>(f)); }
4660

4761
LIBC_INLINE void ungetc(int c, void *f) {
4862
::ungetc(c, reinterpret_cast<::FILE *>(f));
4963
}
5064

51-
LIBC_INLINE int ferror_unlocked(::FILE *f) { return ::ferror_unlocked(f); }
65+
LIBC_INLINE int ferror_unlocked(::FILE *f) { return ::ferror(f); }
5266

5367
#endif // LIBC_COPT_STDIO_USE_SYSTEM_FILE
5468

@@ -59,10 +73,12 @@ namespace scanf_core {
5973
LIBC_INLINE int vfscanf_internal(::FILE *__restrict stream,
6074
const char *__restrict format,
6175
internal::ArgList &args) {
76+
internal::flockfile(stream);
6277
scanf_core::Reader reader(stream, &internal::getc, internal::ungetc);
6378
int retval = scanf_core::scanf_main(&reader, format, args);
6479
if (retval == 0 && internal::ferror_unlocked(stream))
65-
return EOF;
80+
retval = EOF;
81+
internal::funlockfile(stream);
6682

6783
return retval;
6884
}

libcxx/docs/index.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ velocity, libc++ drops support for older compilers as newer ones are released.
116116
============ =============== ========================== =====================
117117
Compiler Versions Restrictions Support policy
118118
============ =============== ========================== =====================
119-
Clang 15, 16, 17-git latest two stable releases per `LLVM's release page <https://releases.llvm.org>`_ and the development version
119+
Clang 16, 17, 18-git latest two stable releases per `LLVM's release page <https://releases.llvm.org>`_ and the development version
120120
AppleClang 15 latest stable release per `Xcode's release page <https://developer.apple.com/documentation/xcode-release-notes>`_
121121
Open XL 17.1 (AIX) latest stable release per `Open XL's documentation page <https://www.ibm.com/docs/en/openxl-c-and-cpp-aix>`_
122122
GCC 12 In C++11 or later only latest stable release per `GCC's release page <https://gcc.gnu.org/releases.html>`_

libcxx/include/__ranges/take_while_view.h

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD
4141

4242
namespace ranges {
4343

44-
// The spec uses the unnamed requirement inside the `begin` and `end` member functions:
45-
// constexpr auto begin() const
46-
// requires range<const V> && indirect_unary_predicate<const Pred, iterator_t<const V>>
47-
// However, due to a clang-14 and clang-15 bug, the above produces a hard error when `const V` is not a range.
48-
// The workaround is to create a named concept and use the concept instead.
49-
// As of take_while_view is implemented, the clang-trunk has already fixed the bug.
50-
// It is OK to remove the workaround once our CI no longer uses clang-14, clang-15 based compilers,
51-
// because we don't actually expect a lot of vendors to ship a new libc++ with an old clang.
52-
template <class _View, class _Pred>
53-
concept __take_while_const_is_range =
54-
range<const _View> && indirect_unary_predicate<const _Pred, iterator_t<const _View>>;
55-
5644
template <view _View, class _Pred>
5745
requires input_range<_View> && is_object_v<_Pred> && indirect_unary_predicate<const _Pred, iterator_t<_View>>
5846
class take_while_view : public view_interface<take_while_view<_View, _Pred>> {
@@ -87,7 +75,7 @@ class take_while_view : public view_interface<take_while_view<_View, _Pred>> {
8775
}
8876

8977
_LIBCPP_HIDE_FROM_ABI constexpr auto begin() const
90-
requires __take_while_const_is_range<_View, _Pred>
78+
requires range<const _View> && indirect_unary_predicate<const _Pred, iterator_t<const _View>>
9179
{
9280
return ranges::begin(__base_);
9381
}
@@ -99,7 +87,7 @@ class take_while_view : public view_interface<take_while_view<_View, _Pred>> {
9987
}
10088

10189
_LIBCPP_HIDE_FROM_ABI constexpr auto end() const
102-
requires __take_while_const_is_range<_View, _Pred>
90+
requires range<const _View> && indirect_unary_predicate<const _Pred, iterator_t<const _View>>
10391
{
10492
return __sentinel</*_Const=*/true>(ranges::end(__base_), std::addressof(*__pred_));
10593
}

libcxx/include/__ranges/to.h

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,13 @@ _LIBCPP_BEGIN_NAMESPACE_STD
4444

4545
namespace ranges {
4646

47-
// TODO(clang-15): in the Standard, it's a `constexpr bool` variable, not a concept, but constexpr variables don't
48-
// short-circuit properly on Clang 15 (fixed in later versions), so use a concept as a workaround.
4947
template <class _Container>
50-
concept __reservable_container = sized_range<_Container> && requires(_Container& __c, range_size_t<_Container> __n) {
51-
__c.reserve(__n);
52-
{ __c.capacity() } -> same_as<decltype(__n)>;
53-
{ __c.max_size() } -> same_as<decltype(__n)>;
54-
};
48+
constexpr bool __reservable_container =
49+
sized_range<_Container> && requires(_Container& __c, range_size_t<_Container> __n) {
50+
__c.reserve(__n);
51+
{ __c.capacity() } -> same_as<decltype(__n)>;
52+
{ __c.max_size() } -> same_as<decltype(__n)>;
53+
};
5554

5655
template <class _Container, class _Ref>
5756
constexpr bool __container_insertable = requires(_Container& __c, _Ref&& __ref) {

libcxx/test/libcxx/experimental/fexperimental-library.compile.pass.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@
1212
// GCC does not support the -fexperimental-library flag
1313
// UNSUPPORTED: gcc
1414

15-
// Clang on AIX currently pretends that it is Clang 15, even though it is not (as of writing
16-
// this, LLVM 15 hasn't even been branched yet).
17-
// UNSUPPORTED: clang-15 && buildhost=aix
18-
1915
// ADDITIONAL_COMPILE_FLAGS: -fexperimental-library
2016

2117
#include <version>

libcxx/test/libcxx/gdb/gdb_pretty_printer_test.sh.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// UNSUPPORTED: c++03
1313

1414
// TODO: Investigate these failures which break the CI.
15-
// UNSUPPORTED: clang-15, clang-16, clang-17, clang-18
15+
// UNSUPPORTED: clang-16, clang-17, clang-18
1616

1717
// TODO: Investigate this failure on GCC 13 (in Ubuntu Jammy)
1818
// UNSUPPORTED: gcc-13

libcxx/test/libcxx/language.support/support.dynamic/libcpp_deallocate.sh.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
// XFAIL: sanitizer-new-delete && !hwasan
2121

22-
// It fails with clang-14 or clang-16, but passes with clang-15.
22+
// TODO: Investigate this failure
2323
// UNSUPPORTED: ubsan
2424

2525
// GCC doesn't support the aligned-allocation flags.

libcxx/test/std/containers/views/mdspan/mdspan/index_operator.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
#include "../ConvertibleToIntegral.h"
3939
#include "CustomTestLayouts.h"
4040

41-
// Clang 15 and 16 do not support argument packs as input to operator []
41+
// Clang 16 does not support argument packs as input to operator []
4242
#if defined(__clang_major__) && __clang_major__ < 17
4343
template <class MDS>
4444
constexpr auto& access(MDS mds) {

libcxx/test/std/language.support/support.srcloc/general.pass.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//===----------------------------------------------------------------------===//
88

99
// UNSUPPORTED: c++03, c++11, c++14, c++17
10-
// UNSUPPORTED: clang-15
1110

1211
#include <source_location>
1312

0 commit comments

Comments
 (0)