https://github.com/yronglin created https://github.com/llvm/llvm-project/pull/99794
None >From 6d9dbc3248ae8e8e374d6d7e656935b1bc82cdee Mon Sep 17 00:00:00 2001 From: yronglin <yronglin...@gmail.com> Date: Sun, 21 Jul 2024 10:54:41 +0800 Subject: [PATCH] [Clang][Interp] Diagnose use sizeless vector type as the argument of __builtin_vectorelements Signed-off-by: yronglin <yronglin...@gmail.com> --- clang/lib/AST/Interp/Compiler.cpp | 6 ++---- clang/lib/AST/Interp/Interp.h | 8 ++++++++ clang/lib/AST/Interp/Opcodes.td | 2 ++ clang/test/SemaCXX/builtin_vectorelements.cpp | 1 + 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/clang/lib/AST/Interp/Compiler.cpp b/clang/lib/AST/Interp/Compiler.cpp index ef579bc5d8972..aeefaf89cfc4b 100644 --- a/clang/lib/AST/Interp/Compiler.cpp +++ b/clang/lib/AST/Interp/Compiler.cpp @@ -1698,10 +1698,8 @@ bool Compiler<Emitter>::VisitUnaryExprOrTypeTraitExpr( if (Kind == UETT_VectorElements) { if (const auto *VT = E->getTypeOfArgument()->getAs<VectorType>()) return this->emitConst(VT->getNumElements(), E); - - // FIXME: Apparently we need to catch the fact that a sizeless vector type - // has been passed and diagnose that (at run time). - assert(E->getTypeOfArgument()->isSizelessVectorType()); + if (E->getTypeOfArgument()->isSizelessVectorType()) + return this->emitSizelessVectorElementSize(E); } if (Kind == UETT_VecStep) { diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h index f86b787fb034e..be224a7b0dfd0 100644 --- a/clang/lib/AST/Interp/Interp.h +++ b/clang/lib/AST/Interp/Interp.h @@ -29,6 +29,7 @@ #include "State.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Expr.h" +#include "clang/Basic/DiagnosticSema.h" #include "llvm/ADT/APFloat.h" #include "llvm/ADT/APSInt.h" #include <type_traits> @@ -870,6 +871,13 @@ bool Comp(InterpState &S, CodePtr OpPC) { return false; } +inline bool SizelessVectorElementSize(InterpState &S, CodePtr OpPC) { + const SourceRange &ArgRange = S.Current->getRange(OpPC); + const Expr *E = S.Current->getExpr(OpPC); + S.FFDiag(E, diag::note_constexpr_non_const_vectorelements) << ArgRange; + return false; +} + //===----------------------------------------------------------------------===// // EQ, NE, GT, GE, LT, LE //===----------------------------------------------------------------------===// diff --git a/clang/lib/AST/Interp/Opcodes.td b/clang/lib/AST/Interp/Opcodes.td index 49ebb156ab2fb..9f29fa9272711 100644 --- a/clang/lib/AST/Interp/Opcodes.td +++ b/clang/lib/AST/Interp/Opcodes.td @@ -733,6 +733,8 @@ def InvalidDeclRef : Opcode { let Args = [ArgDeclRef]; } +def SizelessVectorElementSize : Opcode; + def Assume : Opcode; def ArrayDecay : Opcode; diff --git a/clang/test/SemaCXX/builtin_vectorelements.cpp b/clang/test/SemaCXX/builtin_vectorelements.cpp index 59ff09ac72e42..197ab2fd9625e 100644 --- a/clang/test/SemaCXX/builtin_vectorelements.cpp +++ b/clang/test/SemaCXX/builtin_vectorelements.cpp @@ -2,6 +2,7 @@ // REQUIRES: aarch64-registered-target // RUN: %clang_cc1 -triple aarch64 -target-feature +sve -std=c++20 -fsyntax-only -verify -disable-llvm-passes %s +// RUN: %clang_cc1 -triple aarch64 -target-feature +sve -std=c++20 -fsyntax-only -verify -disable-llvm-passes -fexperimental-new-constant-interpreter %s template <typename T> using VecT __attribute__((vector_size(16))) = T; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits