mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-24 02:46:05 +00:00
[clang][bytecode] Emit better diagnostic for invalid shufflevector index (#111643)
This commit is contained in:
parent
275a2b0581
commit
fed8695bb8
@ -3586,8 +3586,9 @@ bool Compiler<Emitter>::VisitShuffleVectorExpr(const ShuffleVectorExpr *E) {
|
||||
}
|
||||
for (unsigned I = 0; I != NumOutputElems; ++I) {
|
||||
APSInt ShuffleIndex = E->getShuffleMaskIdx(Ctx.getASTContext(), I);
|
||||
assert(ShuffleIndex >= -1);
|
||||
if (ShuffleIndex == -1)
|
||||
return this->emitInvalid(E); // FIXME: Better diagnostic.
|
||||
return this->emitInvalidShuffleVectorIndex(I, E);
|
||||
|
||||
assert(ShuffleIndex < (NumInputElems * 2));
|
||||
if (!this->emitGetLocal(PT_Ptr,
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "clang/AST/DeclObjC.h"
|
||||
#include "clang/AST/Expr.h"
|
||||
#include "clang/AST/ExprCXX.h"
|
||||
#include "clang/Basic/DiagnosticSema.h"
|
||||
#include "llvm/ADT/APSInt.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include <limits>
|
||||
@ -1406,6 +1407,14 @@ bool handleFixedPointOverflow(InterpState &S, CodePtr OpPC,
|
||||
return S.noteUndefinedBehavior();
|
||||
}
|
||||
|
||||
bool InvalidShuffleVectorIndex(InterpState &S, CodePtr OpPC, uint32_t Index) {
|
||||
const SourceInfo &Loc = S.Current->getSource(OpPC);
|
||||
S.FFDiag(Loc,
|
||||
diag::err_shufflevector_minus_one_is_undefined_behavior_constexpr)
|
||||
<< Index;
|
||||
return false;
|
||||
}
|
||||
|
||||
// https://github.com/llvm/llvm-project/issues/102513
|
||||
#if defined(_WIN32) && !defined(__clang__) && !defined(NDEBUG)
|
||||
#pragma optimize("", off)
|
||||
|
@ -161,6 +161,7 @@ bool CallBI(InterpState &S, CodePtr OpPC, const Function *Func,
|
||||
bool CallPtr(InterpState &S, CodePtr OpPC, uint32_t ArgSize,
|
||||
const CallExpr *CE);
|
||||
bool CheckLiteralType(InterpState &S, CodePtr OpPC, const Type *T);
|
||||
bool InvalidShuffleVectorIndex(InterpState &S, CodePtr OpPC, uint32_t Index);
|
||||
|
||||
template <typename T>
|
||||
static bool handleOverflow(InterpState &S, CodePtr OpPC, const T &SrcValue) {
|
||||
|
@ -773,6 +773,9 @@ def InvalidDeclRef : Opcode {
|
||||
}
|
||||
|
||||
def SizelessVectorElementSize : Opcode;
|
||||
def InvalidShuffleVectorIndex : Opcode {
|
||||
let Args = [ArgUint32];
|
||||
}
|
||||
|
||||
def Assume : Opcode;
|
||||
|
||||
|
@ -956,7 +956,7 @@ namespace shufflevector {
|
||||
static_assert(vectorShuffle6[7] == 7, "");
|
||||
|
||||
constexpr vector4char vectorShuffleFail1 = __builtin_shufflevector( // both-error {{must be initialized by a constant expression}}\
|
||||
// ref-error {{index for __builtin_shufflevector not within the bounds of the input vectors; index of -1 found at position 0 is not permitted in a constexpr context}}
|
||||
// both-error {{index for __builtin_shufflevector not within the bounds of the input vectors; index of -1 found at position 0 is not permitted in a constexpr context}}
|
||||
vector4charConst1,
|
||||
vector4charConst2, -1, -1, -1, -1);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user