[cfe-commits] r71489 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/Sema.h lib/Sema/SemaDeclCXX.cpp test/SemaCXX/friend.cpp

Anders Carlsson andersca at mac.com
Mon May 11 15:55:50 PDT 2009


Author: andersca
Date: Mon May 11 17:55:49 2009
New Revision: 71489

URL: http://llvm.org/viewvc/llvm-project?rev=71489&view=rev
Log:
Friend declarations are only valid inside class definitions.

Added:
    cfe/trunk/test/SemaCXX/friend.cpp
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=71489&r1=71488&r2=71489&view=diff

==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon May 11 17:55:49 2009
@@ -243,6 +243,9 @@
   "static_assert expression is not an integral constant expression">;
 def err_static_assert_failed : Error<"static_assert failed \"%0\"">;
 
+def err_friend_decl_outside_class : Error<
+  "'friend' used outside of class">;
+
 def err_abstract_type_in_decl : Error<
   "%select{return|parameter|variable|field}1 type %0 is an abstract class">;
 def err_allocation_of_abstract_type : Error<

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=71489&r1=71488&r2=71489&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Mon May 11 17:55:49 2009
@@ -1731,6 +1731,9 @@
                                                  ExprArg AssertExpr,
                                                  ExprArg AssertMessageExpr);
   
+  virtual bool ActOnFriendDecl(Scope *S, SourceLocation FriendLoc,
+                               DeclPtrTy Dcl);
+
   QualType CheckConstructorDeclarator(Declarator &D, QualType R,
                                       FunctionDecl::StorageClass& SC);
   void CheckConstructor(CXXConstructorDecl *Constructor);

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=71489&r1=71488&r2=71489&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon May 11 17:55:49 2009
@@ -2643,6 +2643,15 @@
   return DeclPtrTy::make(Decl);
 }
 
+bool Sema::ActOnFriendDecl(Scope *S, SourceLocation FriendLoc, DeclPtrTy Dcl) {
+  if (!(S->getFlags() & Scope::ClassScope)) {
+    Diag(FriendLoc, diag::err_friend_decl_outside_class);
+    return true;
+  }
+  
+  return false;
+}
+
 void Sema::SetDeclDeleted(DeclPtrTy dcl, SourceLocation DelLoc) {
   Decl *Dcl = dcl.getAs<Decl>();
   FunctionDecl *Fn = dyn_cast<FunctionDecl>(Dcl);

Added: cfe/trunk/test/SemaCXX/friend.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/friend.cpp?rev=71489&view=auto

==============================================================================
--- cfe/trunk/test/SemaCXX/friend.cpp (added)
+++ cfe/trunk/test/SemaCXX/friend.cpp Mon May 11 17:55:49 2009
@@ -0,0 +1,6 @@
+// RUN: clang-cc -fsyntax-only -verify %s
+
+friend class A; // expected-error {{'friend' used outside of class}}
+void f() { friend class A; } // expected-error {{'friend' used outside of class}}
+class C { friend class A; };
+class D { void f() { friend class A; } }; // expected-error {{'friend' used outside of class}}





More information about the cfe-commits mailing list