Author: Timm Bäder Date: 2024-02-19T10:34:18+01:00 New Revision: 0b34d7e9e2915510088aeee5592a845edd62b8ba
URL: https://github.com/llvm/llvm-project/commit/0b34d7e9e2915510088aeee5592a845edd62b8ba DIFF: https://github.com/llvm/llvm-project/commit/0b34d7e9e2915510088aeee5592a845edd62b8ba.diff LOG: [clang][Interp] Fix calling static operators They don't have an instance pointer anywhere but get one passed via their CallExpr. Added: Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/test/AST/Interp/cxx23.cpp clang/test/SemaCXX/cxx23-static-callop-lambda-expression.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index a778c300fc33a0..4316596bb32a56 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -1716,6 +1716,9 @@ bool ByteCodeExprGen<Emitter>::VisitTypeTraitExpr(const TypeTraitExpr *E) { template <class Emitter> bool ByteCodeExprGen<Emitter>::VisitLambdaExpr(const LambdaExpr *E) { + if (DiscardResult) + return true; + assert(Initializing); const Record *R = P.getOrCreateRecord(E->getLambdaClass()); @@ -2824,6 +2827,20 @@ bool ByteCodeExprGen<Emitter>::VisitCallExpr(const CallExpr *E) { } } + auto Args = E->arguments(); + // Calling a static operator will still + // pass the instance, but we don't need it. + // Discard it here. + if (isa<CXXOperatorCallExpr>(E)) { + if (const auto *MD = + dyn_cast_if_present<CXXMethodDecl>(E->getDirectCallee()); + MD && MD->isStatic()) { + if (!this->discard(E->getArg(0))) + return false; + Args = drop_begin(Args, 1); + } + } + // Add the (optional, implicit) This pointer. if (const auto *MC = dyn_cast<CXXMemberCallExpr>(E)) { if (!this->visit(MC->getImplicitObjectArgument())) @@ -2831,7 +2848,7 @@ bool ByteCodeExprGen<Emitter>::VisitCallExpr(const CallExpr *E) { } // Put arguments on the stack. - for (const auto *Arg : E->arguments()) { + for (const auto *Arg : Args) { if (!this->visit(Arg)) return false; } diff --git a/clang/test/AST/Interp/cxx23.cpp b/clang/test/AST/Interp/cxx23.cpp index a50a9b7183699a..f1df936a5abe74 100644 --- a/clang/test/AST/Interp/cxx23.cpp +++ b/clang/test/AST/Interp/cxx23.cpp @@ -1,7 +1,7 @@ -// RUN: %clang_cc1 -std=c++20 -fsyntax-only -fcxx-exceptions -verify=ref20 %s -// RUN: %clang_cc1 -std=c++23 -fsyntax-only -fcxx-exceptions -verify=ref23 %s -// RUN: %clang_cc1 -std=c++20 -fsyntax-only -fcxx-exceptions -verify=expected20 %s -fexperimental-new-constant-interpreter -// RUN: %clang_cc1 -std=c++23 -fsyntax-only -fcxx-exceptions -verify=expected23 %s -fexperimental-new-constant-interpreter +// RUN: %clang_cc1 -std=c++20 -fsyntax-only -fcxx-exceptions -verify=ref20,all %s +// RUN: %clang_cc1 -std=c++23 -fsyntax-only -fcxx-exceptions -verify=ref23,all %s +// RUN: %clang_cc1 -std=c++20 -fsyntax-only -fcxx-exceptions -verify=expected20,all %s -fexperimental-new-constant-interpreter +// RUN: %clang_cc1 -std=c++23 -fsyntax-only -fcxx-exceptions -verify=expected23,all %s -fexperimental-new-constant-interpreter /// FIXME: The new interpreter is missing all the 'control flows through...' diagnostics. @@ -123,3 +123,24 @@ namespace StaticLambdas { } static_assert(capture_constexpr()); } + +namespace StaticOperators { + auto lstatic = []() static { return 3; }; // ref20-warning {{C++23 extension}} \ + // expected20-warning {{C++23 extension}} + static_assert(lstatic() == 3, ""); + constexpr int (*f2)(void) = lstatic; + static_assert(f2() == 3); + + struct S1 { + constexpr S1() { // all-error {{never produces a constant expression}} + throw; // all-note 2{{not valid in a constant expression}} + } + static constexpr int operator()() { return 3; } // ref20-warning {{C++23 extension}} \ + // expected20-warning {{C++23 extension}} + }; + static_assert(S1{}() == 3, ""); // all-error {{not an integral constant expression}} \ + // all-note {{in call to}} + + + +} diff --git a/clang/test/SemaCXX/cxx23-static-callop-lambda-expression.cpp b/clang/test/SemaCXX/cxx23-static-callop-lambda-expression.cpp index fab76ffc423a3b..2b89e7a3a71291 100644 --- a/clang/test/SemaCXX/cxx23-static-callop-lambda-expression.cpp +++ b/clang/test/SemaCXX/cxx23-static-callop-lambda-expression.cpp @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s - +// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s -fexperimental-new-constant-interpreter namespace ns1 { auto lstatic = []() static { return 3; }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits