Skip to content

Commit

Permalink
[Serialization] Serialize DependentSizedExtVectorType
Browse files Browse the repository at this point in the history
rdar://30659700

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

llvm-svn: 298493
  • Loading branch information
hyp committed Mar 22, 2017
1 parent 28264ed commit 00aee43
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 3 deletions.
4 changes: 3 additions & 1 deletion clang/include/clang/Serialization/ASTBitCodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 11 additions & 0 deletions clang/lib/Serialization/ASTReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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!");
}
Expand Down
6 changes: 4 additions & 2 deletions clang/lib/Serialization/ASTWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 18 additions & 0 deletions clang/test/PCH/cxx-dependent-sized-ext-vector.cpp
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 00aee43

Please sign in to comment.