1
0
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:
Dimitry Andric 2019-03-14 19:41:16 +00:00
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
3 changed files with 35 additions and 0 deletions

View File

@ -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;

View File

@ -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")
};

View File

@ -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