diff --git a/clang/lib/AST/Interp/Function.cpp b/clang/lib/AST/Interp/Function.cpp index e409002171c4b..75312999d23d6 100644 --- a/clang/lib/AST/Interp/Function.cpp +++ b/clang/lib/AST/Interp/Function.cpp @@ -7,11 +7,10 @@ //===----------------------------------------------------------------------===// #include "Function.h" -#include "Opcode.h" #include "Program.h" +#include "Opcode.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" -#include "clang/Basic/Builtins.h" using namespace clang; using namespace clang::interp; @@ -48,9 +47,3 @@ bool Function::isVirtual() const { return M->isVirtual(); return false; } - -bool Function::needsRuntimeArgPop(const ASTContext &Ctx) const { - if (!isBuiltin()) - return false; - return Ctx.BuiltinInfo.hasCustomTypechecking(getBuiltinID()); -} diff --git a/clang/lib/AST/Interp/Function.h b/clang/lib/AST/Interp/Function.h index 5444c9f59cda7..644d4cd53b1e1 100644 --- a/clang/lib/AST/Interp/Function.h +++ b/clang/lib/AST/Interp/Function.h @@ -171,12 +171,6 @@ class Function final { unsigned getBuiltinID() const { return F->getBuiltinID(); } - bool isBuiltin() const { return F->getBuiltinID() != 0; } - - /// Does this function need its arguments to be classified at runtime - /// rather than at bytecode-compile-time? - bool needsRuntimeArgPop(const ASTContext &Ctx) const; - unsigned getNumParams() const { return ParamTypes.size(); } unsigned getParamOffset(unsigned ParamIndex) const { diff --git a/clang/lib/AST/Interp/Interp.cpp b/clang/lib/AST/Interp/Interp.cpp index e006c196f6ed4..b891306e6aa40 100644 --- a/clang/lib/AST/Interp/Interp.cpp +++ b/clang/lib/AST/Interp/Interp.cpp @@ -122,18 +122,6 @@ static bool CheckGlobal(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { namespace clang { namespace interp { -bool popBuiltinArgs(InterpState &S, CodePtr OpPC) { - assert(S.Current && S.Current->getFunction()->needsRuntimeArgPop(S.getCtx())); - const Expr *E = S.Current->getExpr(OpPC); - assert(isa(E)); - const CallExpr *CE = cast(E); - for (const auto *A : llvm::reverse(CE->arguments())) { - PrimType Ty = S.getContext().classify(A->getType()).value_or(PT_Ptr); - TYPE_SWITCH(Ty, S.Stk.discard()); - } - return true; -} - bool CheckExtern(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { if (!Ptr.isExtern()) return true; diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h index 4da5985e3b3d6..9eae79ba5d1e7 100644 --- a/clang/lib/AST/Interp/Interp.h +++ b/clang/lib/AST/Interp/Interp.h @@ -181,9 +181,6 @@ enum class ArithOp { Add, Sub }; // Returning values //===----------------------------------------------------------------------===// -/// Pop arguments of builtins defined as func-name(...). -bool popBuiltinArgs(InterpState &S, CodePtr OpPC); - template ::T> bool Ret(InterpState &S, CodePtr &PC, APValue &Result) { const T &Ret = S.Stk.pop(); @@ -200,16 +197,8 @@ bool Ret(InterpState &S, CodePtr &PC, APValue &Result) { } assert(S.Current->getFrameOffset() == S.Stk.size() && "Invalid frame"); - if (!S.checkingPotentialConstantExpression() || S.Current->Caller) { - // Certain builtin functions are declared as func-name(...), so the - // parameters are checked in Sema and only available through the CallExpr. - // The interp::Function we create for them has 0 parameters, so we need to - // remove them from the stack by checking the CallExpr. - if (S.Current && S.Current->getFunction()->needsRuntimeArgPop(S.getCtx())) - popBuiltinArgs(S, PC); - else - S.Current->popArgs(); - } + if (!S.checkingPotentialConstantExpression() || S.Current->Caller) + S.Current->popArgs(); if (InterpFrame *Caller = S.Current->Caller) { PC = S.Current->getRetPC(); diff --git a/clang/lib/AST/Interp/InterpBuiltin.cpp b/clang/lib/AST/Interp/InterpBuiltin.cpp index 01c41339bba8c..b023d09df4878 100644 --- a/clang/lib/AST/Interp/InterpBuiltin.cpp +++ b/clang/lib/AST/Interp/InterpBuiltin.cpp @@ -162,17 +162,6 @@ static bool interp__builtin_fmin(InterpState &S, CodePtr OpPC, return true; } -/// Defined as __builtin_isnan(...), to accommodate the fact that it can -/// take a float, double, long double, etc. -/// But for us, that's all a Floating anyway. -static bool interp__builtin_isnan(InterpState &S, CodePtr OpPC, - const InterpFrame *Frame, const Function *F) { - const Floating &Arg = S.Stk.peek(); - - S.Stk.push>(Integral<32, true>::from(Arg.isNan())); - return true; -} - bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F) { InterpFrame *Frame = S.Current; APValue Dummy; @@ -234,11 +223,6 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F) { return Ret(S, OpPC, Dummy); break; - case Builtin::BI__builtin_isnan: - if (interp__builtin_isnan(S, OpPC, Frame, F)) - return Ret(S, OpPC, Dummy); - break; - default: return false; } diff --git a/clang/test/Sema/constant-builtins-fmin.cpp b/clang/test/Sema/constant-builtins-fmin.cpp index 8c80f7550666e..bf3e81e21e617 100644 --- a/clang/test/Sema/constant-builtins-fmin.cpp +++ b/clang/test/Sema/constant-builtins-fmin.cpp @@ -1,5 +1,4 @@ // RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify %s -// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify -fexperimental-new-constant-interpreter %s // expected-no-diagnostics constexpr double NaN = __builtin_nan("");