forked from OSchip/llvm-project
Return ExprError if both arguments to the mask form of __builtin_shufflvector don't have the same number of elements or the mask isn't an integer vector.
Previously a diagnostic was issued, but the code went ahead and built the ShuffleVectorExpr. While I'm here also simplify a couple lines by wrapping the return ExprError around the Diag calls. llvm-svn: 187344
This commit is contained in:
parent
96ef078583
commit
baca389e28
|
@ -1657,12 +1657,11 @@ ExprResult Sema::SemaBuiltinShuffleVector(CallExpr *TheCall) {
|
|||
QualType LHSType = TheCall->getArg(0)->getType();
|
||||
QualType RHSType = TheCall->getArg(1)->getType();
|
||||
|
||||
if (!LHSType->isVectorType() || !RHSType->isVectorType()) {
|
||||
Diag(TheCall->getLocStart(), diag::err_shufflevector_non_vector)
|
||||
if (!LHSType->isVectorType() || !RHSType->isVectorType())
|
||||
return ExprError(Diag(TheCall->getLocStart(),
|
||||
diag::err_shufflevector_non_vector)
|
||||
<< SourceRange(TheCall->getArg(0)->getLocStart(),
|
||||
TheCall->getArg(1)->getLocEnd());
|
||||
return ExprError();
|
||||
}
|
||||
TheCall->getArg(1)->getLocEnd()));
|
||||
|
||||
numElements = LHSType->getAs<VectorType>()->getNumElements();
|
||||
unsigned numResElements = TheCall->getNumArgs() - 2;
|
||||
|
@ -1673,14 +1672,15 @@ ExprResult Sema::SemaBuiltinShuffleVector(CallExpr *TheCall) {
|
|||
if (TheCall->getNumArgs() == 2) {
|
||||
if (!RHSType->hasIntegerRepresentation() ||
|
||||
RHSType->getAs<VectorType>()->getNumElements() != numElements)
|
||||
Diag(TheCall->getLocStart(), diag::err_shufflevector_incompatible_vector)
|
||||
return ExprError(Diag(TheCall->getLocStart(),
|
||||
diag::err_shufflevector_incompatible_vector)
|
||||
<< SourceRange(TheCall->getArg(1)->getLocStart(),
|
||||
TheCall->getArg(1)->getLocEnd());
|
||||
TheCall->getArg(1)->getLocEnd()));
|
||||
} else if (!Context.hasSameUnqualifiedType(LHSType, RHSType)) {
|
||||
Diag(TheCall->getLocStart(), diag::err_shufflevector_incompatible_vector)
|
||||
return ExprError(Diag(TheCall->getLocStart(),
|
||||
diag::err_shufflevector_incompatible_vector)
|
||||
<< SourceRange(TheCall->getArg(0)->getLocStart(),
|
||||
TheCall->getArg(1)->getLocEnd());
|
||||
return ExprError();
|
||||
TheCall->getArg(1)->getLocEnd()));
|
||||
} else if (numElements != numResElements) {
|
||||
QualType eltType = LHSType->getAs<VectorType>()->getElementType();
|
||||
resType = Context.getVectorType(eltType, numResElements,
|
||||
|
|
Loading…
Reference in New Issue