This revision was automatically updated to reflect the committed changes. Closed by commit rG43043adcfbc6: Add element-type to the Vector TypeLoc types. (authored by erichkeane). Herald added a project: clang.
Changed prior to commit: https://reviews.llvm.org/D93483?vs=312582&id=315164#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D93483/new/ https://reviews.llvm.org/D93483 Files: clang/include/clang/AST/TypeLoc.h clang/lib/Sema/SemaType.cpp clang/lib/Sema/TreeTransform.h clang/test/SemaCXX/vector.cpp
Index: clang/test/SemaCXX/vector.cpp =================================================================== --- clang/test/SemaCXX/vector.cpp +++ clang/test/SemaCXX/vector.cpp @@ -513,3 +513,20 @@ } } // namespace PR45780 + +namespace PR48540 { +// The below used to cause an OOM error, or an assert, make sure it is still +// valid. +int (__attribute__((vector_size(16))) a); + +template <typename T, int I> +struct S { + T (__attribute__((vector_size(16))) a); + int (__attribute__((vector_size(I))) b); + T (__attribute__((vector_size(I))) c); +}; + +void use() { + S<int, 16> s; +} +} // namespace PR48540 Index: clang/lib/Sema/TreeTransform.h =================================================================== --- clang/lib/Sema/TreeTransform.h +++ clang/lib/Sema/TreeTransform.h @@ -5178,7 +5178,7 @@ QualType TreeTransform<Derived>::TransformDependentVectorType( TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { const DependentVectorType *T = TL.getTypePtr(); - QualType ElementType = getDerived().TransformType(T->getElementType()); + QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); if (ElementType.isNull()) return QualType(); @@ -5219,7 +5219,7 @@ const DependentSizedExtVectorType *T = TL.getTypePtr(); // FIXME: ext vector locs should be nested - QualType ElementType = getDerived().TransformType(T->getElementType()); + QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); if (ElementType.isNull()) return QualType(); @@ -5386,7 +5386,7 @@ QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, VectorTypeLoc TL) { const VectorType *T = TL.getTypePtr(); - QualType ElementType = getDerived().TransformType(T->getElementType()); + QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); if (ElementType.isNull()) return QualType(); @@ -5409,7 +5409,7 @@ QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, ExtVectorTypeLoc TL) { const VectorType *T = TL.getTypePtr(); - QualType ElementType = getDerived().TransformType(T->getElementType()); + QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); if (ElementType.isNull()) return QualType(); Index: clang/lib/Sema/SemaType.cpp =================================================================== --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -6135,6 +6135,17 @@ void VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { TL.setExpansionLoc(Chunk.Loc); } + void VisitVectorTypeLoc(VectorTypeLoc TL) { TL.setNameLoc(Chunk.Loc); } + void VisitDependentVectorTypeLoc(DependentVectorTypeLoc TL) { + TL.setNameLoc(Chunk.Loc); + } + void VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { + TL.setNameLoc(Chunk.Loc); + } + void + VisitDependentSizedExtVectorTypeLoc(DependentSizedExtVectorTypeLoc TL) { + TL.setNameLoc(Chunk.Loc); + } void VisitTypeLoc(TypeLoc TL) { llvm_unreachable("unsupported TypeLoc kind in declarator!"); Index: clang/include/clang/AST/TypeLoc.h =================================================================== --- clang/include/clang/AST/TypeLoc.h +++ clang/include/clang/AST/TypeLoc.h @@ -1749,30 +1749,79 @@ // FIXME: size expression and attribute locations (or keyword if we // ever fully support altivec syntax). -class VectorTypeLoc : public InheritingConcreteTypeLoc<TypeSpecTypeLoc, - VectorTypeLoc, - VectorType> { +struct VectorTypeLocInfo { + SourceLocation NameLoc; +}; + +class VectorTypeLoc : public ConcreteTypeLoc<UnqualTypeLoc, VectorTypeLoc, + VectorType, VectorTypeLocInfo> { +public: + SourceLocation getNameLoc() const { return this->getLocalData()->NameLoc; } + + void setNameLoc(SourceLocation Loc) { this->getLocalData()->NameLoc = Loc; } + + SourceRange getLocalSourceRange() const { + return SourceRange(getNameLoc(), getNameLoc()); + } + + void initializeLocal(ASTContext &Context, SourceLocation Loc) { + setNameLoc(Loc); + } + + TypeLoc getElementLoc() const { return getInnerTypeLoc(); } + + QualType getInnerType() const { return this->getTypePtr()->getElementType(); } }; // FIXME: size expression and attribute locations (or keyword if we // ever fully support altivec syntax). class DependentVectorTypeLoc - : public InheritingConcreteTypeLoc<TypeSpecTypeLoc, - DependentVectorTypeLoc, - DependentVectorType> {}; + : public ConcreteTypeLoc<UnqualTypeLoc, DependentVectorTypeLoc, + DependentVectorType, VectorTypeLocInfo> { +public: + SourceLocation getNameLoc() const { return this->getLocalData()->NameLoc; } -// FIXME: size expression and attribute locations. -class ExtVectorTypeLoc : public InheritingConcreteTypeLoc<VectorTypeLoc, - ExtVectorTypeLoc, - ExtVectorType> { + void setNameLoc(SourceLocation Loc) { this->getLocalData()->NameLoc = Loc; } + + SourceRange getLocalSourceRange() const { + return SourceRange(getNameLoc(), getNameLoc()); + } + + void initializeLocal(ASTContext &Context, SourceLocation Loc) { + setNameLoc(Loc); + } + + TypeLoc getElementLoc() const { return getInnerTypeLoc(); } + + QualType getInnerType() const { return this->getTypePtr()->getElementType(); } }; +// FIXME: size expression and attribute locations. +class ExtVectorTypeLoc + : public InheritingConcreteTypeLoc<VectorTypeLoc, ExtVectorTypeLoc, + ExtVectorType> {}; + // FIXME: attribute locations. // For some reason, this isn't a subtype of VectorType. -class DependentSizedExtVectorTypeLoc : - public InheritingConcreteTypeLoc<TypeSpecTypeLoc, - DependentSizedExtVectorTypeLoc, - DependentSizedExtVectorType> { +class DependentSizedExtVectorTypeLoc + : public ConcreteTypeLoc<UnqualTypeLoc, DependentSizedExtVectorTypeLoc, + DependentSizedExtVectorType, VectorTypeLocInfo> { +public: + SourceLocation getNameLoc() const { return this->getLocalData()->NameLoc; } + + void setNameLoc(SourceLocation Loc) { this->getLocalData()->NameLoc = Loc; } + + SourceRange getLocalSourceRange() const { + return SourceRange(getNameLoc(), getNameLoc()); + } + + void initializeLocal(ASTContext &Context, SourceLocation Loc) { + setNameLoc(Loc); + } + + TypeLoc getElementLoc() const { return getInnerTypeLoc(); } + + QualType getInnerType() const { return this->getTypePtr()->getElementType(); } }; struct MatrixTypeLocInfo {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits