diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-02-17 17:39:40 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-02-17 17:39:40 +0000 |
commit | afdfdc05fe8b2442713f0150a5985a9c6d852cee (patch) | |
tree | 08ad36bd1d1452d83caefa4accdd4a9f183c6df3 /lib/AST/Decl.cpp | |
parent | 2a96bf5e66731bb54dff3e4aadfbbced83377530 (diff) |
Devirtualize DeclaratorDecl::getInnerLocStart() and TagDecl::getInnerLocStart().
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125754 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Decl.cpp')
-rw-r--r-- | lib/AST/Decl.cpp | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 0b07d13cba..8c55d0e7ab 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -969,6 +969,20 @@ void DeclaratorDecl::setQualifierInfo(NestedNameSpecifier *Qualifier, } } +SourceLocation DeclaratorDecl::getInnerLocStart() const { + if (const VarDecl *Var = dyn_cast<VarDecl>(this)) { + SourceLocation Start = Var->getTypeSpecStartLoc(); + if (Start.isValid()) + return Start; + } else if (const NonTypeTemplateParmDecl *NTTP + = dyn_cast<NonTypeTemplateParmDecl>(this)) { + SourceLocation Start = NTTP->getTypeSpecStartLoc(); + if (Start.isValid()) + return Start; + } + return getLocation(); +} + SourceLocation DeclaratorDecl::getOuterLocStart() const { return getTemplateOrInnerLocStart(this); } @@ -1029,13 +1043,6 @@ void VarDecl::setStorageClass(StorageClass SC) { SClass = SC; } -SourceLocation VarDecl::getInnerLocStart() const { - SourceLocation Start = getTypeSpecStartLoc(); - if (Start.isInvalid()) - Start = getLocation(); - return Start; -} - SourceRange VarDecl::getSourceRange() const { if (getInit()) return SourceRange(getOuterLocStart(), getInit()->getLocEnd()); @@ -1959,6 +1966,17 @@ unsigned FieldDecl::getFieldIndex() const { // TagDecl Implementation //===----------------------------------------------------------------------===// +SourceLocation TagDecl::getInnerLocStart() const { + if (const ClassTemplateSpecializationDecl *Spec + = dyn_cast<ClassTemplateSpecializationDecl>(this)) { + SourceLocation Start = Spec->getTemplateKeywordLoc(); + if (Start.isValid()) + return Start; + } + + return getTagKeywordLoc(); +} + SourceLocation TagDecl::getOuterLocStart() const { return getTemplateOrInnerLocStart(this); } |