diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:11:37 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:11:37 +0000 |
| commit | 461a67fa15370a9ec88f8f8a240bf7c123bb2029 (patch) | |
| tree | 6942083d7d56bba40ec790a453ca58ad3baf6832 /lib/AST/TypeLoc.cpp | |
| parent | 75c3240472ba6ac2669ee72ca67eb72d4e2851fc (diff) | |
Notes
Diffstat (limited to 'lib/AST/TypeLoc.cpp')
| -rw-r--r-- | lib/AST/TypeLoc.cpp | 131 |
1 files changed, 81 insertions, 50 deletions
diff --git a/lib/AST/TypeLoc.cpp b/lib/AST/TypeLoc.cpp index c9a268655723..b05c5fc68096 100644 --- a/lib/AST/TypeLoc.cpp +++ b/lib/AST/TypeLoc.cpp @@ -1,4 +1,4 @@ -//===--- TypeLoc.cpp - Type Source Info Wrapper -----------------*- C++ -*-===// +//===- TypeLoc.cpp - Type Source Info Wrapper -----------------------------===// // // The LLVM Compiler Infrastructure // @@ -14,8 +14,19 @@ #include "clang/AST/TypeLoc.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Expr.h" +#include "clang/AST/NestedNameSpecifier.h" +#include "clang/AST/TemplateBase.h" +#include "clang/AST/TemplateName.h" #include "clang/AST/TypeLocVisitor.h" +#include "clang/Basic/SourceLocation.h" +#include "clang/Basic/Specifiers.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/MathExtras.h" +#include <algorithm> +#include <cassert> +#include <cstdint> +#include <cstring> + using namespace clang; static const unsigned TypeLocMaxDataAlign = alignof(void *); @@ -25,16 +36,18 @@ static const unsigned TypeLocMaxDataAlign = alignof(void *); //===----------------------------------------------------------------------===// namespace { - class TypeLocRanger : public TypeLocVisitor<TypeLocRanger, SourceRange> { - public: + +class TypeLocRanger : public TypeLocVisitor<TypeLocRanger, SourceRange> { +public: #define ABSTRACT_TYPELOC(CLASS, PARENT) #define TYPELOC(CLASS, PARENT) \ - SourceRange Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ - return TyLoc.getLocalSourceRange(); \ - } + SourceRange Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ + return TyLoc.getLocalSourceRange(); \ + } #include "clang/AST/TypeLocNodes.def" - }; -} +}; + +} // namespace SourceRange TypeLoc::getLocalSourceRangeImpl(TypeLoc TL) { if (TL.isNull()) return SourceRange(); @@ -42,16 +55,18 @@ SourceRange TypeLoc::getLocalSourceRangeImpl(TypeLoc TL) { } namespace { - class TypeAligner : public TypeLocVisitor<TypeAligner, unsigned> { - public: + +class TypeAligner : public TypeLocVisitor<TypeAligner, unsigned> { +public: #define ABSTRACT_TYPELOC(CLASS, PARENT) #define TYPELOC(CLASS, PARENT) \ - unsigned Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ - return TyLoc.getLocalDataAlignment(); \ - } + unsigned Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ + return TyLoc.getLocalDataAlignment(); \ + } #include "clang/AST/TypeLocNodes.def" - }; -} +}; + +} // namespace /// \brief Returns the alignment of the type source info data block. unsigned TypeLoc::getLocalAlignmentForType(QualType Ty) { @@ -60,16 +75,18 @@ unsigned TypeLoc::getLocalAlignmentForType(QualType Ty) { } namespace { - class TypeSizer : public TypeLocVisitor<TypeSizer, unsigned> { - public: + +class TypeSizer : public TypeLocVisitor<TypeSizer, unsigned> { +public: #define ABSTRACT_TYPELOC(CLASS, PARENT) #define TYPELOC(CLASS, PARENT) \ - unsigned Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ - return TyLoc.getLocalDataSize(); \ - } + unsigned Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ + return TyLoc.getLocalDataSize(); \ + } #include "clang/AST/TypeLocNodes.def" - }; -} +}; + +} // namespace /// \brief Returns the size of the type source info data block. unsigned TypeLoc::getFullDataSizeForType(QualType Ty) { @@ -88,16 +105,18 @@ unsigned TypeLoc::getFullDataSizeForType(QualType Ty) { } namespace { - class NextLoc : public TypeLocVisitor<NextLoc, TypeLoc> { - public: + +class NextLoc : public TypeLocVisitor<NextLoc, TypeLoc> { +public: #define ABSTRACT_TYPELOC(CLASS, PARENT) #define TYPELOC(CLASS, PARENT) \ - TypeLoc Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ - return TyLoc.getNextTypeLoc(); \ - } + TypeLoc Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ + return TyLoc.getNextTypeLoc(); \ + } #include "clang/AST/TypeLocNodes.def" - }; -} +}; + +} // namespace /// \brief Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the /// TypeLoc is a PointerLoc and next TypeLoc is for "int". @@ -127,20 +146,22 @@ void TypeLoc::initializeImpl(ASTContext &Context, TypeLoc TL, } namespace { - class TypeLocCopier : public TypeLocVisitor<TypeLocCopier> { - TypeLoc Source; - public: - TypeLocCopier(TypeLoc source) : Source(source) { } + +class TypeLocCopier : public TypeLocVisitor<TypeLocCopier> { + TypeLoc Source; + +public: + TypeLocCopier(TypeLoc source) : Source(source) {} #define ABSTRACT_TYPELOC(CLASS, PARENT) #define TYPELOC(CLASS, PARENT) \ - void Visit##CLASS##TypeLoc(CLASS##TypeLoc dest) { \ - dest.copyLocal(Source.castAs<CLASS##TypeLoc>()); \ - } + void Visit##CLASS##TypeLoc(CLASS##TypeLoc dest) { \ + dest.copyLocal(Source.castAs<CLASS##TypeLoc>()); \ + } #include "clang/AST/TypeLocNodes.def" - }; -} +}; +} // namespace void TypeLoc::copy(TypeLoc other) { assert(getFullDataSize() == other.getFullDataSize()); @@ -243,22 +264,22 @@ SourceLocation TypeLoc::getEndLoc() const { } } - namespace { - struct TSTChecker : public TypeLocVisitor<TSTChecker, bool> { - // Overload resolution does the real work for us. - static bool isTypeSpec(TypeSpecTypeLoc _) { return true; } - static bool isTypeSpec(TypeLoc _) { return false; } + +struct TSTChecker : public TypeLocVisitor<TSTChecker, bool> { + // Overload resolution does the real work for us. + static bool isTypeSpec(TypeSpecTypeLoc _) { return true; } + static bool isTypeSpec(TypeLoc _) { return false; } #define ABSTRACT_TYPELOC(CLASS, PARENT) #define TYPELOC(CLASS, PARENT) \ - bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ - return isTypeSpec(TyLoc); \ - } + bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc) { \ + return isTypeSpec(TyLoc); \ + } #include "clang/AST/TypeLocNodes.def" - }; -} +}; +} // namespace /// \brief Determines if the given type loc corresponds to a /// TypeSpecTypeLoc. Since there is not actually a TypeSpecType in @@ -319,6 +340,7 @@ TypeSpecifierType BuiltinTypeLoc::getWrittenTypeSpec() const { case BuiltinType::Float: case BuiltinType::Double: case BuiltinType::LongDouble: + case BuiltinType::Float16: case BuiltinType::Float128: llvm_unreachable("Builtin type needs extra local data!"); // Fall through, if the impossible happens. @@ -363,7 +385,7 @@ SourceLocation TypeLoc::findNullabilityLoc() const { return attributedLoc.getAttrNameLoc(); } - return SourceLocation(); + return {}; } TypeLoc TypeLoc::findExplicitQualifierLoc() const { @@ -384,7 +406,7 @@ TypeLoc TypeLoc::findExplicitQualifierLoc() const { return atomic; } - return TypeLoc(); + return {}; } void ObjCTypeParamTypeLoc::initializeLocal(ASTContext &Context, @@ -422,6 +444,15 @@ void TypeOfTypeLoc::initializeLocal(ASTContext &Context, getUnderlyingType(), Loc); } +void UnaryTransformTypeLoc::initializeLocal(ASTContext &Context, + SourceLocation Loc) { + setKWLoc(Loc); + setRParenLoc(Loc); + setLParenLoc(Loc); + this->setUnderlyingTInfo( + Context.getTrivialTypeSourceInfo(getTypePtr()->getBaseType(), Loc)); +} + void ElaboratedTypeLoc::initializeLocal(ASTContext &Context, SourceLocation Loc) { setElaboratedKeywordLoc(Loc); |
