CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
183 lines
5.2 KiB
C++
183 lines
5.2 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
template<typename T> struct A {
|
|
struct B { };
|
|
|
|
friend struct B;
|
|
};
|
|
|
|
void f() {
|
|
A<int>::B b;
|
|
}
|
|
|
|
struct C0 {
|
|
friend struct A<int>;
|
|
};
|
|
|
|
namespace PR6770 {
|
|
namespace N {
|
|
int f1(int);
|
|
}
|
|
using namespace N;
|
|
|
|
namespace M {
|
|
float f1(float);
|
|
}
|
|
using M::f1;
|
|
|
|
template<typename T> void f1(T, T);
|
|
template <class T>
|
|
void f() {
|
|
friend class f; // expected-error{{'friend' used outside of class}}
|
|
friend class f1; // expected-error{{'friend' used outside of class}}
|
|
}
|
|
}
|
|
|
|
namespace friend_redecl_inline {
|
|
// We had a bug where instantiating the foo friend declaration would check the
|
|
// defined-ness of the most recent decl while checking if the canonical decl was
|
|
// inlined.
|
|
void foo();
|
|
void bar();
|
|
template <typename T>
|
|
class C {
|
|
friend void foo();
|
|
friend inline void bar();
|
|
};
|
|
inline void foo() {}
|
|
inline void bar() {}
|
|
C<int> c;
|
|
}
|
|
|
|
namespace qualified_friend {
|
|
void f(int); // expected-note 2{{type mismatch at 1st parameter}}
|
|
template<typename T> void f(T*); // expected-note 2{{could not match 'T *' against 'double'}}
|
|
template<typename T> void nondep();
|
|
|
|
template<typename> struct X1 {
|
|
friend void qualified_friend::f(double); // expected-error {{friend declaration of 'f' does not match any declaration in namespace 'qualified_friend'}}
|
|
friend void qualified_friend::g(); // expected-error {{friend declaration of 'g' does not match any declaration in namespace 'qualified_friend'}}
|
|
};
|
|
template<typename T> struct X2 {
|
|
friend void qualified_friend::f(T); // expected-error {{friend declaration of 'f' does not match any declaration in namespace 'qualified_friend'}}
|
|
};
|
|
X1<int> xi;
|
|
X2<double> xd; // expected-note {{in instantiation of}}
|
|
X2<int> x2i;
|
|
|
|
struct Y {
|
|
void f(int); // expected-note 2{{type mismatch at 1st parameter}}
|
|
template<typename T> void f(T*); // expected-note 2{{could not match 'T *' against 'double'}}
|
|
template<typename T> void nondep();
|
|
};
|
|
|
|
template<typename> struct Z1 {
|
|
friend void Y::f(double); // expected-error {{friend declaration of 'f' does not match any declaration in 'qualified_friend::Y'}}
|
|
friend void Y::g(); // expected-error {{friend declaration of 'g' does not match any declaration in 'qualified_friend::Y'}}
|
|
};
|
|
template<typename T> struct Z2 {
|
|
friend void Y::f(T); // expected-error {{friend declaration of 'f' does not match any declaration in 'qualified_friend::Y'}}
|
|
};
|
|
Z1<int> zi;
|
|
Z2<double> zd; // expected-note {{in instantiation of}}
|
|
Z2<int> z2i;
|
|
|
|
template<typename T>
|
|
struct OK {
|
|
friend void qualified_friend::f(int);
|
|
friend void qualified_friend::f(int*);
|
|
friend void qualified_friend::f(T*);
|
|
friend void qualified_friend::f<T>(T*);
|
|
friend void qualified_friend::nondep<int>();
|
|
friend void qualified_friend::nondep<T>();
|
|
|
|
friend void Y::f(int);
|
|
friend void Y::f(int*);
|
|
friend void Y::f(T*);
|
|
friend void Y::f<T>(T*);
|
|
friend void Y::nondep<int>();
|
|
friend void Y::nondep<T>();
|
|
};
|
|
OK<float> ok;
|
|
}
|
|
|
|
namespace qualified_friend_finds_nothing {
|
|
// FIXME: The status of this example is unclear. For now, we diagnose if the
|
|
// qualified declaration has nothing it can redeclare, but allow qualified
|
|
// lookup to find later-declared function templates during instantiation.
|
|
//
|
|
// This matches the behavior of GCC, EDG, ICC, and MSVC (except that GCC and
|
|
// ICC bizarrely accept the instantiation of B<float>).
|
|
namespace N {}
|
|
|
|
template<typename T> struct A {
|
|
friend void N::f(T); // expected-error {{friend declaration of 'f' does not match}}
|
|
};
|
|
namespace N { void f(); } // expected-note {{different number of parameters}}
|
|
|
|
template<typename T> struct B {
|
|
friend void N::f(T); // expected-error {{friend declaration of 'f' does not match}}
|
|
};
|
|
B<float> bf; // expected-note {{in instantiation of}}
|
|
|
|
namespace N { void f(int); }
|
|
B<int> bi; // ok?!
|
|
}
|
|
|
|
namespace PR37556 {
|
|
inline namespace N { int x1, x2, y1, y2; } // expected-note 2{{previous}}
|
|
struct X {
|
|
friend void x1(int);
|
|
friend void PR37556::x2(int); // expected-error {{different kind}}
|
|
};
|
|
template<typename T> struct Y {
|
|
friend void y1(T);
|
|
friend void PR37556::y2(T); // expected-error {{different kind}}
|
|
};
|
|
template struct Y<int>;
|
|
template<typename T> struct Z {
|
|
friend void z1(T);
|
|
friend void PR37556::z2(T); // expected-error {{does not match any}}
|
|
};
|
|
inline namespace N { int z1, z2; }
|
|
template struct Z<int>;
|
|
}
|
|
|
|
namespace PR42513_comment3 {
|
|
template<typename X> struct T { friend auto f(X*) { return nullptr; } };
|
|
struct X1 { friend auto f(X1*); };
|
|
template struct T<X1>;
|
|
int n = f((X1*)nullptr); // expected-error {{cannot initialize a variable of type 'int' with an rvalue of type 'std::nullptr_t'}}
|
|
}
|
|
|
|
namespace GH61851 {
|
|
namespace A {
|
|
inline namespace B {
|
|
constexpr struct {} foo;
|
|
}
|
|
|
|
template <typename T>
|
|
class Bar {
|
|
template <typename U>
|
|
friend void foo(U &&arg) {} // no diagnostic expected
|
|
};
|
|
}
|
|
|
|
void foobar() {
|
|
A::Bar<int> b;
|
|
}
|
|
}
|
|
|
|
namespace InstQualifier1 {
|
|
template <class> struct A {
|
|
template <class T> void f(T);
|
|
};
|
|
void g() {
|
|
A<int>().f(0);
|
|
}
|
|
template <class T> template <class U> void A<T>::f(U) {
|
|
struct B {
|
|
B() {}
|
|
};
|
|
}
|
|
} // namespace InstQualifier1
|