mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-19 09:26:59 +00:00
[clang][Interp] Handle PredefinedExprs
Differential Revision: https://reviews.llvm.org/D148689
This commit is contained in:
parent
b7bd3a734c
commit
1e9ac71787
@ -932,6 +932,14 @@ bool ByteCodeExprGen<Emitter>::VisitLambdaExpr(const LambdaExpr *E) {
|
|||||||
return true;
|
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) {
|
template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) {
|
||||||
if (E->containsErrors())
|
if (E->containsErrors())
|
||||||
return false;
|
return false;
|
||||||
|
@ -94,6 +94,7 @@ public:
|
|||||||
bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
|
bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
|
||||||
bool VisitTypeTraitExpr(const TypeTraitExpr *E);
|
bool VisitTypeTraitExpr(const TypeTraitExpr *E);
|
||||||
bool VisitLambdaExpr(const LambdaExpr *E);
|
bool VisitLambdaExpr(const LambdaExpr *E);
|
||||||
|
bool VisitPredefinedExpr(const PredefinedExpr *E);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool visitExpr(const Expr *E) override;
|
bool visitExpr(const Expr *E) override;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -std=c++11 -verify %s
|
// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fms-extensions -std=c++11 -verify %s
|
||||||
// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -std=c++20 -verify %s
|
// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fms-extensions -std=c++20 -verify %s
|
||||||
// RUN: %clang_cc1 -std=c++11 -verify=ref %s
|
// RUN: %clang_cc1 -std=c++11 -fms-extensions -verify=ref %s
|
||||||
// RUN: %clang_cc1 -std=c++20 -verify=ref %s
|
// RUN: %clang_cc1 -std=c++20 -fms-extensions -verify=ref %s
|
||||||
|
|
||||||
#define INT_MIN (~__INT_MAX__)
|
#define INT_MIN (~__INT_MAX__)
|
||||||
#define INT_MAX __INT_MAX__
|
#define INT_MAX __INT_MAX__
|
||||||
@ -851,3 +851,26 @@ constexpr int ignoredExprs() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#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
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user