|
| 1 | +//===----------------------------------------------------------------------===// |
| 2 | +// |
| 3 | +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | +// See https://llvm.org/LICENSE.txt for license information. |
| 5 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | +// |
| 7 | +//===----------------------------------------------------------------------===// |
| 8 | + |
| 9 | +// REQUIRES: stdlib=apple-libc++ |
| 10 | + |
| 11 | +// This test is dependent on the code generated by the compiler, and it doesn't |
| 12 | +// work properly with older AppleClangs. |
| 13 | +// UNSUPPORTED: apple-clang-15 |
| 14 | + |
| 15 | +// This test ensures that we retain a way to disable availability markup on Apple platforms |
| 16 | +// in order to work around Clang bug https://github.com/llvm/llvm-project/issues/134151. |
| 17 | +// |
| 18 | +// Once that bug has been fixed or once we've made changes to libc++'s use of availability |
| 19 | +// that render that workaround unnecessary, the macro and this test can be removed. |
| 20 | +// |
| 21 | +// The test works by creating a final linked image that refers to a function marked with |
| 22 | +// both an availability attribute and with _LIBCPP_HIDE_FROM_ABI. We then check that this |
| 23 | +// generates a weak reference to the function -- without the bug, we'd expect a strong |
| 24 | +// reference or no reference at all instead. |
| 25 | + |
| 26 | +// First, test the test. Make sure that we do (incorrectly) produce a weak definition when we |
| 27 | +// don't define _LIBCPP_DISABLE_AVAILABILITY. Otherwise, something may have changed in libc++ |
| 28 | +// and this test might not work anymore. |
| 29 | +// RUN: %{cxx} %s %{flags} %{compile_flags} %{link_flags} -fvisibility=hidden -fvisibility-inlines-hidden -shared -o %t.1.dylib |
| 30 | +// RUN: nm -m %t.1.dylib | c++filt | grep value > %t.1.symbols |
| 31 | +// RUN: grep weak %t.1.symbols |
| 32 | + |
| 33 | +// Now, make sure that 'weak' goes away when we define _LIBCPP_DISABLE_AVAILABILITY. |
| 34 | +// In fact, all references to the function might go away, so we just check that we don't emit |
| 35 | +// any weak reference. |
| 36 | +// RUN: %{cxx} %s %{flags} %{compile_flags} %{link_flags} -fvisibility=hidden -fvisibility-inlines-hidden -D_LIBCPP_DISABLE_AVAILABILITY -shared -o %t.2.dylib |
| 37 | +// RUN: nm -m %t.2.dylib | c++filt | grep value > %t.2.symbols |
| 38 | +// RUN: not grep weak %t.2.symbols |
| 39 | + |
| 40 | +#include <version> |
| 41 | + |
| 42 | +template <class T> |
| 43 | +struct optional { |
| 44 | + T val_; |
| 45 | + _LIBCPP_HIDE_FROM_ABI _LIBCPP_INTRODUCED_IN_LLVM_11_ATTRIBUTE T value() const { return val_; } |
| 46 | +}; |
| 47 | + |
| 48 | +using PMF = int (optional<int>::*)() const; |
| 49 | +PMF f() { return &optional<int>::value; } |
0 commit comments