mirror of
https://git.FreeBSD.org/src.git
synced 2024-10-18 02:19:39 +00:00
Vendor import of clang release_80 branch r356034:
https://llvm.org/svn/llvm-project/cfe/branches/release_80@356034
This commit is contained in:
parent
f463519f0c
commit
54a27abbcb
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor/clang/dist-release_80/; revision=345144 svn path=/vendor/clang/clang-release_80-r356034/; revision=345145; tag=vendor/clang/clang-release_80-r356034
@ -10985,6 +10985,7 @@ bool Expr::EvaluateAsConstantExpr(EvalResult &Result, ConstExprUsage Usage,
|
||||
const ASTContext &Ctx) const {
|
||||
EvalInfo::EvaluationMode EM = EvalInfo::EM_ConstantExpression;
|
||||
EvalInfo Info(Ctx, Result, EM);
|
||||
Info.InConstantContext = true;
|
||||
if (!::Evaluate(Result.Val, Info, this))
|
||||
return false;
|
||||
|
||||
@ -11625,6 +11626,7 @@ bool Expr::EvaluateWithSubstitution(APValue &Value, ASTContext &Ctx,
|
||||
const Expr *This) const {
|
||||
Expr::EvalStatus Status;
|
||||
EvalInfo Info(Ctx, Status, EvalInfo::EM_ConstantExpressionUnevaluated);
|
||||
Info.InConstantContext = true;
|
||||
|
||||
LValue ThisVal;
|
||||
const LValue *ThisPtr = nullptr;
|
||||
@ -11708,6 +11710,7 @@ bool Expr::isPotentialConstantExprUnevaluated(Expr *E,
|
||||
|
||||
EvalInfo Info(FD->getASTContext(), Status,
|
||||
EvalInfo::EM_PotentialConstantExpressionUnevaluated);
|
||||
Info.InConstantContext = true;
|
||||
|
||||
// Fabricate a call stack frame to give the arguments a plausible cover story.
|
||||
ArrayRef<const Expr*> Args;
|
||||
|
@ -1135,3 +1135,27 @@ constexpr bool indirect_builtin_constant_p(const char *__s) {
|
||||
return __builtin_constant_p(*__s);
|
||||
}
|
||||
constexpr bool n = indirect_builtin_constant_p("a");
|
||||
|
||||
__attribute__((enable_if(indirect_builtin_constant_p("a") == n, "OK")))
|
||||
int test_in_enable_if() { return 0; }
|
||||
int n2 = test_in_enable_if();
|
||||
|
||||
template <bool n = indirect_builtin_constant_p("a")>
|
||||
int test_in_template_param() { return 0; }
|
||||
int n3 = test_in_template_param();
|
||||
|
||||
void test_in_case(int n) {
|
||||
switch (n) {
|
||||
case indirect_builtin_constant_p("abc"):
|
||||
break;
|
||||
}
|
||||
}
|
||||
enum InEnum1 {
|
||||
ONE = indirect_builtin_constant_p("abc")
|
||||
};
|
||||
enum InEnum2 : int {
|
||||
TWO = indirect_builtin_constant_p("abc")
|
||||
};
|
||||
enum class InEnum3 {
|
||||
THREE = indirect_builtin_constant_p("abc")
|
||||
};
|
||||
|
@ -514,3 +514,11 @@ namespace TypeOfFn {
|
||||
|
||||
static_assert(is_same<__typeof__(foo)*, decltype(&foo)>::value, "");
|
||||
}
|
||||
|
||||
namespace InConstantContext {
|
||||
void foo(const char *s) __attribute__((enable_if(((void)__builtin_constant_p(*s), true), "trap"))) {}
|
||||
|
||||
void test() {
|
||||
InConstantContext::foo("abc");
|
||||
}
|
||||
} // namespace InConstantContext
|
||||
|
Loading…
Reference in New Issue
Block a user