forked from OSchip/llvm-project
Tighten type-checking for vector attributes.
Based on patch by Yunzhong Gao. llvm-svn: 187176
This commit is contained in:
parent
bf44f366a1
commit
efe9fa62f5
|
@ -1315,6 +1315,8 @@ protected:
|
|||
|
||||
/// NumElements - The number of elements in the vector.
|
||||
unsigned NumElements : 29 - NumTypeBits;
|
||||
|
||||
enum { MaxNumElements = (1 << (29 - NumTypeBits)) - 1 };
|
||||
};
|
||||
|
||||
class AttributedTypeBitfields {
|
||||
|
@ -2524,6 +2526,9 @@ public:
|
|||
|
||||
QualType getElementType() const { return ElementType; }
|
||||
unsigned getNumElements() const { return VectorTypeBits.NumElements; }
|
||||
static bool isVectorSizeTooLarge(unsigned NumElements) {
|
||||
return NumElements > VectorTypeBitfields::MaxNumElements;
|
||||
}
|
||||
|
||||
bool isSugared() const { return false; }
|
||||
QualType desugar() const { return QualType(this, 0); }
|
||||
|
|
|
@ -1829,6 +1829,7 @@ def err_init_method_bad_return_type : Error<
|
|||
def err_attribute_invalid_size : Error<
|
||||
"vector size not an integral multiple of component size">;
|
||||
def err_attribute_zero_size : Error<"zero vector size">;
|
||||
def err_attribute_size_too_large : Error<"vector size too large">;
|
||||
def err_typecheck_vector_not_convertable : Error<
|
||||
"can't convert between vector values of different size (%0 and %1)">;
|
||||
def err_typecheck_ext_vector_not_typedef : Error<
|
||||
|
|
|
@ -1645,6 +1645,12 @@ QualType Sema::BuildExtVectorType(QualType T, Expr *ArraySize,
|
|||
return QualType();
|
||||
}
|
||||
|
||||
if (VectorType::isVectorSizeTooLarge(vectorSize)) {
|
||||
Diag(AttrLoc, diag::err_attribute_size_too_large)
|
||||
<< ArraySize->getSourceRange();
|
||||
return QualType();
|
||||
}
|
||||
|
||||
return Context.getExtVectorType(T, vectorSize);
|
||||
}
|
||||
|
||||
|
@ -4521,7 +4527,8 @@ static void HandleVectorSizeAttr(QualType& CurType, const AttributeList &Attr,
|
|||
return;
|
||||
}
|
||||
// the base type must be integer or float, and can't already be a vector.
|
||||
if (!CurType->isIntegerType() && !CurType->isRealFloatingType()) {
|
||||
if (!CurType->isBuiltinType() ||
|
||||
(!CurType->isIntegerType() && !CurType->isRealFloatingType())) {
|
||||
S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType;
|
||||
Attr.setInvalid();
|
||||
return;
|
||||
|
@ -4537,6 +4544,12 @@ static void HandleVectorSizeAttr(QualType& CurType, const AttributeList &Attr,
|
|||
Attr.setInvalid();
|
||||
return;
|
||||
}
|
||||
if (VectorType::isVectorSizeTooLarge(vectorSize / typeSize)) {
|
||||
S.Diag(Attr.getLoc(), diag::err_attribute_size_too_large)
|
||||
<< sizeExpr->getSourceRange();
|
||||
Attr.setInvalid();
|
||||
return;
|
||||
}
|
||||
if (vectorSize == 0) {
|
||||
S.Diag(Attr.getLoc(), diag::err_attribute_zero_size)
|
||||
<< sizeExpr->getSourceRange();
|
||||
|
|
|
@ -64,3 +64,11 @@ void test(int i) {
|
|||
void test2(int i) {
|
||||
char c = (char __attribute__((may_alias))) i;
|
||||
}
|
||||
|
||||
// vector size too large
|
||||
int __attribute__ ((vector_size(8192))) x1; // expected-error {{vector size too large}}
|
||||
typedef int __attribute__ ((ext_vector_type(8192))) x2; // expected-error {{vector size too large}}
|
||||
|
||||
// no support for vector enum type
|
||||
enum { e_2 } x3 __attribute__((vector_size(64))); // expected-error {{invalid vector element type}}
|
||||
|
||||
|
|
Loading…
Reference in New Issue