mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 07:06:42 +00:00

This patch removes many annotations that are not relevant anymore since we don't support or test back-deploying to macOS < 10.13. It also cleans up raw usage of target triples to identify versions of dylibs shipped on prior versions of macOS, and uses the target-agnostic Lit features instead. Finally, it reorders both the Lit backdeployment features and the corresponding availability macros in the library in a way that makes more sense, and reformulates the Lit backdeployment features in terms of when a version of LLVM was introduced instead of encoding the system versions on which it hasn't been introduced yet. Although one can be derived from the other, encoding the negative form is extremely error-prone. Fixes #80901
177 lines
2.5 KiB
C++
177 lines
2.5 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// UNSUPPORTED: no-exceptions
|
|
|
|
#include <cassert>
|
|
|
|
struct A
|
|
{
|
|
A() : i(0), j(0) {} // explicitly initialize 'i' to prevent warnings
|
|
const int i;
|
|
int j;
|
|
};
|
|
|
|
typedef const int A::*md1;
|
|
typedef int A::*md2;
|
|
|
|
struct B : public A
|
|
{
|
|
B() : k(0), l(0) {} // explicitly initialize 'k' to prevent warnings.
|
|
const int k;
|
|
int l;
|
|
};
|
|
|
|
typedef const int B::*der1;
|
|
typedef int B::*der2;
|
|
|
|
void test1()
|
|
{
|
|
try
|
|
{
|
|
throw &A::i;
|
|
assert(false);
|
|
}
|
|
catch (md2)
|
|
{
|
|
assert(false);
|
|
}
|
|
catch (md1)
|
|
{
|
|
}
|
|
}
|
|
|
|
// Check that cv qualified conversions are allowed.
|
|
void test2()
|
|
{
|
|
try
|
|
{
|
|
throw &A::j;
|
|
}
|
|
catch (md2)
|
|
{
|
|
}
|
|
catch (...)
|
|
{
|
|
assert(false);
|
|
}
|
|
|
|
try
|
|
{
|
|
throw &A::j;
|
|
assert(false);
|
|
}
|
|
catch (md1)
|
|
{
|
|
}
|
|
catch (...)
|
|
{
|
|
assert(false);
|
|
}
|
|
}
|
|
|
|
// Check that Base -> Derived conversions are NOT allowed.
|
|
void test3()
|
|
{
|
|
try
|
|
{
|
|
throw &A::i;
|
|
assert(false);
|
|
}
|
|
catch (md2)
|
|
{
|
|
assert(false);
|
|
}
|
|
catch (der2)
|
|
{
|
|
assert(false);
|
|
}
|
|
catch (der1)
|
|
{
|
|
assert(false);
|
|
}
|
|
catch (md1)
|
|
{
|
|
}
|
|
}
|
|
|
|
// Check that Base -> Derived conversions NOT are allowed with different cv
|
|
// qualifiers.
|
|
void test4()
|
|
{
|
|
try
|
|
{
|
|
throw &A::j;
|
|
assert(false);
|
|
}
|
|
catch (der2)
|
|
{
|
|
assert(false);
|
|
}
|
|
catch (der1)
|
|
{
|
|
assert(false);
|
|
}
|
|
catch (md2)
|
|
{
|
|
}
|
|
catch (...)
|
|
{
|
|
assert(false);
|
|
}
|
|
}
|
|
|
|
// Check that no Derived -> Base conversions are allowed.
|
|
void test5()
|
|
{
|
|
try
|
|
{
|
|
throw &B::k;
|
|
assert(false);
|
|
}
|
|
catch (md1)
|
|
{
|
|
assert(false);
|
|
}
|
|
catch (md2)
|
|
{
|
|
assert(false);
|
|
}
|
|
catch (der1)
|
|
{
|
|
}
|
|
|
|
try
|
|
{
|
|
throw &B::l;
|
|
assert(false);
|
|
}
|
|
catch (md1)
|
|
{
|
|
assert(false);
|
|
}
|
|
catch (md2)
|
|
{
|
|
assert(false);
|
|
}
|
|
catch (der2)
|
|
{
|
|
}
|
|
}
|
|
|
|
int main(int, char**)
|
|
{
|
|
test1();
|
|
test2();
|
|
test3();
|
|
test4();
|
|
test5();
|
|
|
|
return 0;
|
|
}
|