Author: Timm Bäder Date: 2023-06-16T15:52:12+02:00 New Revision: 1e9ac717877b5a9410db99a8f0d61fa9ca144b44
URL: https://github.com/llvm/llvm-project/commit/1e9ac717877b5a9410db99a8f0d61fa9ca144b44 DIFF: https://github.com/llvm/llvm-project/commit/1e9ac717877b5a9410db99a8f0d61fa9ca144b44.diff LOG: [clang][Interp] Handle PredefinedExprs Differential Revision: https://reviews.llvm.org/D148689 Added: Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/lib/AST/Interp/ByteCodeExprGen.h clang/test/AST/Interp/literals.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index b2a27725307f8..8558ba0ba1ee7 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -932,6 +932,14 @@ bool ByteCodeExprGen<Emitter>::VisitLambdaExpr(const LambdaExpr *E) { return true; } +template <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitPredefinedExpr(const PredefinedExpr *E) { + if (DiscardResult) + return true; + + return this->visit(E->getFunctionName()); +} + template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) { if (E->containsErrors()) return false; diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.h b/clang/lib/AST/Interp/ByteCodeExprGen.h index 70961bea98c31..8708bf99d91e7 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.h +++ b/clang/lib/AST/Interp/ByteCodeExprGen.h @@ -94,6 +94,7 @@ class ByteCodeExprGen : public ConstStmtVisitor<ByteCodeExprGen<Emitter>, bool>, bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); bool VisitTypeTraitExpr(const TypeTraitExpr *E); bool VisitLambdaExpr(const LambdaExpr *E); + bool VisitPredefinedExpr(const PredefinedExpr *E); protected: bool visitExpr(const Expr *E) override; diff --git a/clang/test/AST/Interp/literals.cpp b/clang/test/AST/Interp/literals.cpp index 1a93a951ee3f7..3c81c6ff04e6f 100644 --- a/clang/test/AST/Interp/literals.cpp +++ b/clang/test/AST/Interp/literals.cpp @@ -1,7 +1,7 @@ -// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -std=c++11 -verify %s -// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -std=c++20 -verify %s -// RUN: %clang_cc1 -std=c++11 -verify=ref %s -// RUN: %clang_cc1 -std=c++20 -verify=ref %s +// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fms-extensions -std=c++11 -verify %s +// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fms-extensions -std=c++20 -verify %s +// RUN: %clang_cc1 -std=c++11 -fms-extensions -verify=ref %s +// RUN: %clang_cc1 -std=c++20 -fms-extensions -verify=ref %s #define INT_MIN (~__INT_MAX__) #define INT_MAX __INT_MAX__ @@ -851,3 +851,26 @@ constexpr int ignoredExprs() { } #endif + +namespace PredefinedExprs { +#if __cplusplus >= 201402L + template<typename CharT> + constexpr bool strings_match(const CharT *str1, const CharT *str2) { + while (*str1 && *str2) { + if (*str1++ != *str2++) + return false; + }; + + return *str1 == *str2; + } + + void foo() { + static_assert(strings_match(__FUNCSIG__, "void __cdecl PredefinedExprs::foo(void)"), ""); + static_assert(strings_match(L__FUNCSIG__, L"void __cdecl PredefinedExprs::foo(void)"), ""); + static_assert(strings_match(L__FUNCTION__, L"foo"), ""); + static_assert(strings_match(__FUNCTION__, "foo"), ""); + static_assert(strings_match(__func__, "foo"), ""); + static_assert(strings_match(__PRETTY_FUNCTION__, "void PredefinedExprs::foo()"), ""); + } +#endif +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits