From: Abramo Bagnara Date: Thu, 4 Oct 2012 21:39:47 +0000 (+0000) Subject: Fixed friend decl source range. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=03a400510fb8ba2e88e27c95ec797d944d944c4b;p=clang Fixed friend decl source range. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165257 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclFriend.h b/include/clang/AST/DeclFriend.h index a5f736739b..b40144388a 100644 --- a/include/clang/AST/DeclFriend.h +++ b/include/clang/AST/DeclFriend.h @@ -16,6 +16,7 @@ #define LLVM_CLANG_AST_DECLFRIEND_H #include "clang/AST/DeclCXX.h" +#include "clang/AST/DeclTemplate.h" #include "llvm/Support/Compiler.h" namespace clang { @@ -104,10 +105,15 @@ public: /// Retrieves the source range for the friend declaration. SourceRange getSourceRange() const LLVM_READONLY { - // FIXME: If this is a friend function declaration, the 'friend' keyword - // might not be the first token of the declaration. - if (NamedDecl *ND = getFriendDecl()) + if (NamedDecl *ND = getFriendDecl()) { + if (FunctionTemplateDecl *FTD = dyn_cast(ND)) + return FTD->getSourceRange(); + if (DeclaratorDecl *DD = dyn_cast(ND)) { + if (DD->getOuterLocStart() != DD->getInnerLocStart()) + return DD->getSourceRange(); + } return SourceRange(getFriendLoc(), ND->getLocEnd()); + } else if (TypeSourceInfo *TInfo = getFriendType()) return SourceRange(getFriendLoc(), TInfo->getTypeLoc().getEndLoc()); else