diff options
-rw-r--r-- | clang/include/clang/AST/TypeLoc.h | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/clang/include/clang/AST/TypeLoc.h b/clang/include/clang/AST/TypeLoc.h index 946e555a506..525f848a9fa 100644 --- a/clang/include/clang/AST/TypeLoc.h +++ b/clang/include/clang/AST/TypeLoc.h @@ -75,22 +75,7 @@ public: /// adjustments from a type that wad written as a T to another type that is /// still canonically a T (ignores parens, attributes, elaborated types, etc). template <typename T> - T getAsAdjusted() const { - TypeLoc Cur = *this; - while (!T::isKind(Cur)) { - if (auto PTL = Cur.getAs<ParenTypeLoc>()) - Cur = PTL.getInnerLoc(); - else if (auto ATL = Cur.getAs<AttributedTypeLoc>()) - Cur = ATL.getModifiedLoc(); - else if (auto ETL = Cur.getAs<ElaboratedTypeLoc>()) - Cur = ETL.getNamedTypeLoc(); - else if (auto ATL = Cur.getAs<AdjustedTypeLoc>()) - Cur = ATL.getOriginalLoc(); - else - break; - } - return Cur.getAs<T>(); - } + T getAsAdjusted() const; /// The kinds of TypeLocs. Equivalent to the Type::TypeClass enum, /// except it also defines a Qualified enum that corresponds to the @@ -2210,6 +2195,24 @@ public: QualType getInnerType() const { return this->getTypePtr()->getElementType(); } }; + +template <typename T> +inline T TypeLoc::getAsAdjusted() const { + TypeLoc Cur = *this; + while (!T::isKind(Cur)) { + if (auto PTL = Cur.getAs<ParenTypeLoc>()) + Cur = PTL.getInnerLoc(); + else if (auto ATL = Cur.getAs<AttributedTypeLoc>()) + Cur = ATL.getModifiedLoc(); + else if (auto ETL = Cur.getAs<ElaboratedTypeLoc>()) + Cur = ETL.getNamedTypeLoc(); + else if (auto ATL = Cur.getAs<AdjustedTypeLoc>()) + Cur = ATL.getOriginalLoc(); + else + break; + } + return Cur.getAs<T>(); +} } #endif |