diff options
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 3 | ||||
-rw-r--r-- | test/CXX/class/class.friend/p1.cpp | 8 |
2 files changed, 10 insertions, 1 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index ee6238c56c..61f0ce808a 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2390,7 +2390,8 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC, FunctionDecl *NewFD; if (isFriend) { // DC is the namespace in which the function is being declared. - assert(DC->isFileContext() || D.getCXXScopeSpec().isSet()); + assert((DC->isFileContext() || PrevDecl) && "previously-undeclared " + "friend function being created in a non-namespace context"); // C++ [class.friend]p5 // A function can be defined in a friend declaration of a diff --git a/test/CXX/class/class.friend/p1.cpp b/test/CXX/class/class.friend/p1.cpp index 80afe3e7a5..1b2c4dfcd4 100644 --- a/test/CXX/class/class.friend/p1.cpp +++ b/test/CXX/class/class.friend/p1.cpp @@ -18,6 +18,11 @@ struct Derived : public Base { int myglobal; +void global_function(); +extern "C" { + void global_c_function(); +} + class A { class AInner { }; @@ -29,6 +34,9 @@ class A { friend int myoperation(float); // okay friend int myglobal; // expected-error {{ friends can only be classes or functions }} + friend void global_function(); + friend void global_c_function(); + void a_member(); friend void A::a_member(); // expected-error {{ friends cannot be members of the declaring class }} friend void a_member(); // okay (because we ignore class scopes when looking up friends) |