diff options
author | John McCall <rjmccall@apple.com> | 2009-09-11 21:02:39 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2009-09-11 21:02:39 +0000 |
commit | 2f212b3a72b1dbc89346830fa2bcf861a8d2f785 (patch) | |
tree | a232582e31ba80c032a35d8b9e6bca03d20cb98c /clang/lib | |
parent | c0f8eef71085f472fee402afa90eecac8c0ce98e (diff) | |
download | bcm5719-llvm-2f212b3a72b1dbc89346830fa2bcf861a8d2f785.tar.gz bcm5719-llvm-2f212b3a72b1dbc89346830fa2bcf861a8d2f785.zip |
Alter Action's friend interface to prepare for templated friend declarations and
to stop making promises we can't currently keep.
llvm-svn: 81571
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Parse/ParseCXXInlineMethods.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Parse/ParseDeclCXX.cpp | 16 | ||||
-rw-r--r-- | clang/lib/Sema/Sema.h | 9 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 36 |
4 files changed, 26 insertions, 37 deletions
diff --git a/clang/lib/Parse/ParseCXXInlineMethods.cpp b/clang/lib/Parse/ParseCXXInlineMethods.cpp index 82b7da9f68e..c34653ee425 100644 --- a/clang/lib/Parse/ParseCXXInlineMethods.cpp +++ b/clang/lib/Parse/ParseCXXInlineMethods.cpp @@ -34,7 +34,7 @@ Parser::ParseCXXInlineMethodDef(AccessSpecifier AS, Declarator &D, DeclPtrTy FnD; if (D.getDeclSpec().isFriendSpecified()) // FIXME: Friend templates - FnD = Actions.ActOnFriendDecl(CurScope, &D, /*IsDefinition*/ true); + FnD = Actions.ActOnFriendFunctionDecl(CurScope, D, true, move(TemplateParams)); else // FIXME: pass template information through FnD = Actions.ActOnCXXMemberDeclarator(CurScope, AS, D, move(TemplateParams), 0, 0); diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index bb268e70c00..b9a0d6165e7 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -1019,7 +1019,7 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, if (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate) return; - Actions.ActOnFriendDecl(CurScope, &DS, /*IsDefinition*/ false); + Actions.ActOnFriendTypeDecl(CurScope, DS); } else Actions.ParsedFreeStandingDeclSpec(CurScope, DS); @@ -1122,15 +1122,17 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, // this call will *not* return the created decl; It will return null. // See Sema::ActOnCXXMemberDeclarator for details. + Action::MultiTemplateParamsArg TemplateParams(Actions, + TemplateInfo.TemplateParams? TemplateInfo.TemplateParams->data() : 0, + TemplateInfo.TemplateParams? TemplateInfo.TemplateParams->size() : 0); + DeclPtrTy ThisDecl; if (DS.isFriendSpecified()) { - // TODO: handle initializers, bitfields, 'delete', friend templates - ThisDecl = Actions.ActOnFriendDecl(CurScope, &DeclaratorInfo, - /*IsDefinition*/ false); + // TODO: handle initializers, bitfields, 'delete' + ThisDecl = Actions.ActOnFriendFunctionDecl(CurScope, DeclaratorInfo, + /*IsDefinition*/ false, + move(TemplateParams)); } else { - Action::MultiTemplateParamsArg TemplateParams(Actions, - TemplateInfo.TemplateParams? TemplateInfo.TemplateParams->data() : 0, - TemplateInfo.TemplateParams? TemplateInfo.TemplateParams->size() : 0); ThisDecl = Actions.ActOnCXXMemberDeclarator(CurScope, AS, DeclaratorInfo, move(TemplateParams), diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 873cc47d891..d6bc6e51ddd 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -2245,12 +2245,9 @@ public: ExprArg AssertExpr, ExprArg AssertMessageExpr); - virtual DeclPtrTy ActOnFriendDecl(Scope *S, - llvm::PointerUnion<const DeclSpec*,Declarator*> D, - bool IsDefinition); - DeclPtrTy ActOnFriendTypeDecl(Scope *S, const DeclSpec& DS, - bool IsDefinition); - DeclPtrTy ActOnFriendFunctionDecl(Scope *S, Declarator& D, bool IsDefinition); + DeclPtrTy ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS); + DeclPtrTy ActOnFriendFunctionDecl(Scope *S, Declarator &D, bool IsDefinition, + MultiTemplateParamsArg TemplateParams); QualType CheckConstructorDeclarator(Declarator &D, QualType R, FunctionDecl::StorageClass& SC); diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 97d7b2f76da..79b017b3300 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -4008,18 +4008,8 @@ Sema::DeclPtrTy Sema::ActOnStaticAssertDeclaration(SourceLocation AssertLoc, return DeclPtrTy::make(Decl); } -Sema::DeclPtrTy Sema::ActOnFriendDecl(Scope *S, - llvm::PointerUnion<const DeclSpec*,Declarator*> DU, - bool IsDefinition) { - if (DU.is<Declarator*>()) - return ActOnFriendFunctionDecl(S, *DU.get<Declarator*>(), IsDefinition); - else - return ActOnFriendTypeDecl(S, *DU.get<const DeclSpec*>(), IsDefinition); -} - Sema::DeclPtrTy Sema::ActOnFriendTypeDecl(Scope *S, - const DeclSpec &DS, - bool IsDefinition) { + const DeclSpec &DS) { SourceLocation Loc = DS.getSourceRange().getBegin(); assert(DS.isFriendSpecified()); @@ -4056,17 +4046,13 @@ Sema::DeclPtrTy Sema::ActOnFriendTypeDecl(Scope *S, } } + bool IsDefinition = false; FriendDecl::FriendUnion FU = T.getTypePtr(); - // The parser doesn't quite handle - // friend class A { ... } - // optimally, because it might have been the (valid) prefix of - // friend class A { ... } foo(); - // So in a very particular set of circumstances, we need to adjust - // IsDefinition. - // - // Also, if we made a RecordDecl in ActOnTag, we want that to be the - // object of our friend declaration. + // We want to do a few things differently if the type was declared with + // a tag: specifically, we want to use the associated RecordDecl as + // the object of our friend declaration, and we want to disallow + // class definitions. switch (DS.getTypeSpecType()) { default: break; case DeclSpec::TST_class: @@ -4106,9 +4092,13 @@ Sema::DeclPtrTy Sema::ActOnFriendTypeDecl(Scope *S, return DeclPtrTy::make(FD); } -Sema::DeclPtrTy Sema::ActOnFriendFunctionDecl(Scope *S, - Declarator &D, - bool IsDefinition) { +Sema::DeclPtrTy +Sema::ActOnFriendFunctionDecl(Scope *S, + Declarator &D, + bool IsDefinition, + MultiTemplateParamsArg TemplateParams) { + // FIXME: do something with template parameters + const DeclSpec &DS = D.getDeclSpec(); assert(DS.isFriendSpecified()); |