r177003 applied the late parsed template technique to friend functions but omitted the corresponding check for redefinitions. This patch adds the same check already in use for templates to the new code path in order to diagnose and reject invalid redefinitions that were being silently accepted. Fixes PR17324. Reviewed by Richard Smith. llvm-svn: 192948
45 lines
1011 B
C++
45 lines
1011 B
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
class C {
|
|
friend class D;
|
|
};
|
|
|
|
class A {
|
|
public:
|
|
void f();
|
|
};
|
|
|
|
friend int x; // expected-error {{'friend' used outside of class}}
|
|
|
|
friend class D {}; // expected-error {{'friend' used outside of class}}
|
|
|
|
union U {
|
|
int u1;
|
|
};
|
|
|
|
class B {
|
|
// 'A' here should refer to the declaration above.
|
|
friend class A;
|
|
|
|
friend C; // expected-warning {{specify 'class' to befriend}}
|
|
friend U; // expected-warning {{specify 'union' to befriend}}
|
|
friend int; // expected-warning {{non-class friend type 'int'}}
|
|
|
|
friend void myfunc();
|
|
|
|
void f(A *a) { a->f(); }
|
|
};
|
|
|
|
void bar() {} // expected-note {{previous definition is here}}
|
|
class E {
|
|
friend void bar() {} // expected-error {{redefinition of 'bar'}}
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename t1, typename t2> class some_template;
|
|
friend // expected-error {{'friend' used outside of class}}
|
|
some_template<foo, bar>& // expected-error {{use of undeclared identifier 'foo'}}
|
|
; // expected-error {{expected unqualified-id}}
|