Files
clang-p2996/clang/test/Parser/cxx-friend.cpp
Alp Toker 19bff32e09 Check "late parsed" friend functions for redefinition
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
2013-10-18 05:54:24 +00:00

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}}