mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 23:51:56 +00:00
d38057f3ec
corresponding constructor for access checking purposes.
47 lines
977 B
C++
47 lines
977 B
C++
// RUN: %clang_cc1 -std=c++17 -verify %s
|
|
|
|
namespace pr41427 {
|
|
template <typename T> class A {
|
|
public:
|
|
A(void (*)(T)) {}
|
|
};
|
|
|
|
void D(int) {}
|
|
|
|
void f() {
|
|
A a(&D);
|
|
using T = decltype(a);
|
|
using T = A<int>;
|
|
}
|
|
}
|
|
|
|
namespace Access {
|
|
struct B {
|
|
protected:
|
|
struct type {};
|
|
};
|
|
template<typename T> struct D : B { // expected-note {{not viable}}
|
|
D(T, typename T::type); // expected-note {{private member}}
|
|
};
|
|
D b = {B(), {}};
|
|
|
|
class X {
|
|
using type = int;
|
|
};
|
|
D x = {X(), {}}; // expected-error {{no viable constructor or deduction guide}}
|
|
|
|
// Once we implement proper support for dependent nested name specifiers in
|
|
// friends, this should still work.
|
|
class Y {
|
|
template <typename T> friend D<T>::D(T, typename T::type); // expected-warning {{dependent nested name specifier}}
|
|
struct type {};
|
|
};
|
|
D y = {Y(), {}};
|
|
|
|
class Z {
|
|
template <typename T> friend class D;
|
|
struct type {};
|
|
};
|
|
D z = {Z(), {}};
|
|
}
|