[clang] [Clang][Interp] Diagnose use sizeless vector type as the argument of `__builtin_vectorelements` (PR #99794)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Jul 20 19:57:44 PDT 2024
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 <yronglin777 at 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 <yronglin777 at 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;
More information about the cfe-commits
mailing list