// Welcome, Build Wrangler!
//
// A failure in this test indicates that there is a potential ABI breaking
// change in the Standard Library. If you observe a failure, please reach out to
// the Standard Library team directly to make sure we resolve this quickly!
//
// Instead of XFAILing this test, please consider extending the list of expected
// changes at the bottom. (In addition to ignoring the current set of ABI breaks,
// XFAILing this test also silences any future ABI breaks that may land on this
// branch, which isn't ideal.)
//
// You can find a diff of what needs to be added in the output of the failed
// test run. The order of lines doesn't matter, and you can also include
// comments to refer to any bugs you filed.
//
// Thanks! -- Your friendly stdlib engineers

// REQUIRES: OS=macosx
// REQUIRES: swift_stdlib_asserts

// SR-13362
// This currently fails on non-Intel architectures due to no baseline being
// available and it is not possible to filter across architectures in the
// output.
// XFAIL: CPU=arm64 || CPU=arm64e

// RUN: %empty-directory(%t.tmp)
// mkdir %t.tmp/module-cache && mkdir %t.tmp/dummy.sdk
// RUN: %api-digester -diagnose-sdk -module Swift -o %t.tmp/changes.txt -module-cache-path %t.tmp/module-cache -sdk %t.tmp/dummy.sdk -abi -avoid-location
// RUN: %clang -E -P -x c %S/stability-stdlib-abi-without-asserts.test -o - > %t.tmp/stability-stdlib-abi.swift.expected
// RUN: %clang -E -P -x c %S/stability-stdlib-abi-with-asserts.test -o - >> %t.tmp/stability-stdlib-abi.swift.expected
// RUN: %clang -E -P -x c %t.tmp/stability-stdlib-abi.swift.expected -o - | sed '/^\s*$/d' | sort > %t.tmp/stability-stdlib-abi.swift.expected.sorted
// RUN: %clang -E -P -x c %t.tmp/changes.txt -o - | sed '/^\s*$/d' | sort > %t.tmp/changes.txt.tmp
// RUN: diff -u %t.tmp/stability-stdlib-abi.swift.expected.sorted %t.tmp/changes.txt.tmp

// The digester can incorrectly register a generic signature change when
// declarations are shuffled. rdar://problem/46618883
// UNSUPPORTED: swift_evolve

Func Collection.removingSubranges(_:) has been removed
Func Collection.subranges(of:) has been removed
Func Collection.subranges(where:) has been removed
Func MutableCollection.moveSubranges(_:to:) has been removed
Func MutableCollection.removeSubranges(_:) has been removed
Func RangeReplaceableCollection.removeSubranges(_:) has been removed
Func _collectReferencesInsideObject(_:) is a new API without @available attribute
Func _loadDestroyTLSCounter() is a new API without @available attribute
Func _measureRuntimeFunctionCountersDiffs(objects:_:) is a new API without @available attribute
Protocol _RuntimeFunctionCountersStats is a new API without @available attribute
Struct DiscontiguousSlice has been removed
Struct RangeSet has been removed
Struct _GlobalRuntimeFunctionCountersState is a new API without @available attribute
Struct _ObjectRuntimeFunctionCountersState is a new API without @available attribute
Struct _RuntimeFunctionCounters is a new API without @available attribute
Subscript Collection.subscript(_:) has been removed
Subscript MutableCollection.subscript(_:) has been removed
