[Serialization] Serialize DependentSizedExtVectorType

rdar://30659700

Differential Revision: https://reviews.llvm.org/D31134

llvm-svn: 298493
This commit is contained in:
Alex Lorenz 2017-03-22 10:04:48 +00:00
parent 28264edea3
commit 00aee43734
4 changed files with 36 additions and 3 deletions

View File

@ -927,7 +927,9 @@ namespace clang {
/// \brief An ObjCTypeParamType record.
TYPE_OBJC_TYPE_PARAM = 44,
/// \brief A DeducedTemplateSpecializationType record.
TYPE_DEDUCED_TEMPLATE_SPECIALIZATION = 45
TYPE_DEDUCED_TEMPLATE_SPECIALIZATION = 45,
/// \brief A DependentSizedExtVectorType record.
TYPE_DEPENDENT_SIZED_EXT_VECTOR = 46
};
/// \brief The type IDs for special types constructed by semantic

View File

@ -6073,6 +6073,17 @@ QualType ASTReader::readTypeRecord(unsigned Index) {
return Context.getPipeType(ElementType, ReadOnly);
}
case TYPE_DEPENDENT_SIZED_EXT_VECTOR: {
unsigned Idx = 0;
// DependentSizedExtVectorType
QualType ElementType = readType(*Loc.F, Record, Idx);
Expr *SizeExpr = ReadExpr(*Loc.F);
SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx);
return Context.getDependentSizedExtVectorType(ElementType, SizeExpr,
AttrLoc);
}
}
llvm_unreachable("Invalid TypeCode!");
}

View File

@ -426,8 +426,10 @@ ASTTypeWriter::VisitDependentSizedArrayType(const DependentSizedArrayType *T) {
void
ASTTypeWriter::VisitDependentSizedExtVectorType(
const DependentSizedExtVectorType *T) {
// FIXME: Serialize this type (C++ only)
llvm_unreachable("Cannot serialize dependent sized extended vector types");
Record.AddTypeRef(T->getElementType());
Record.AddStmt(T->getSizeExpr());
Record.AddSourceLocation(T->getAttributeLoc());
Code = TYPE_DEPENDENT_SIZED_EXT_VECTOR;
}
void

View File

@ -0,0 +1,18 @@
// RUN: %clang_cc1 -std=c++11 -emit-pch %s -o %t
// RUN: %clang_cc1 -std=c++11 -include-pch %t -verify %s
#ifndef HEADER_INCLUDED
#define HEADER_INCLUDED
template<typename T, int N>
using vec = T __attribute__((ext_vector_type(N)));
#else
void test() {
vec<float, 2> a; // expected-error@-5 {{zero vector size}}
vec<float, 0> b; // expected-note {{in instantiation of template type alias 'vec' requested here}}
}
#endif