erichkeane created this revision. erichkeane added reviewers: fhahn, rjmccall. erichkeane requested review of this revision.
As shown by bug 48540, GCC vector types would cause a crash when the declaration hada ParenType. This was because the walking of the declaration would try to expand the 'inner' type, but there was no ability to get it from the vector type. This patch adds that element type access to the vector type loc objects. 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,22 @@ } } // 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 @@ -5176,7 +5176,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(); @@ -5217,7 +5217,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(); @@ -5384,7 +5384,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(); @@ -5407,7 +5407,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 @@ -6133,6 +6133,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