forked from OSchip/llvm-project
Finish building the full-expression for a static_assert expression
before evaluating it rather than afterwards. This is groundwork for C++20's P0784R7, where non-trivial destructors can be constexpr, so we need ExprWithCleanups markers in constant expressions. No significant functionality change intended (though this fixes a bug only visible through libclang / -ast-dump / tooling: we now store the converted condition on the StaticAssertDecl rather than the original). llvm-svn: 372368
This commit is contained in:
parent
8c77674e0f
commit
4aef105b43
|
@ -14182,8 +14182,17 @@ Decl *Sema::BuildStaticAssertDeclaration(SourceLocation StaticAssertLoc,
|
|||
if (Converted.isInvalid())
|
||||
Failed = true;
|
||||
|
||||
ExprResult FullAssertExpr =
|
||||
ActOnFinishFullExpr(Converted.get(), StaticAssertLoc,
|
||||
/*DiscardedValue*/ false,
|
||||
/*IsConstexpr*/ true);
|
||||
if (FullAssertExpr.isInvalid())
|
||||
Failed = true;
|
||||
else
|
||||
AssertExpr = FullAssertExpr.get();
|
||||
|
||||
llvm::APSInt Cond;
|
||||
if (!Failed && VerifyIntegerConstantExpression(Converted.get(), &Cond,
|
||||
if (!Failed && VerifyIntegerConstantExpression(AssertExpr, &Cond,
|
||||
diag::err_static_assert_expression_is_not_constant,
|
||||
/*AllowFold=*/false).isInvalid())
|
||||
Failed = true;
|
||||
|
@ -14209,16 +14218,16 @@ Decl *Sema::BuildStaticAssertDeclaration(SourceLocation StaticAssertLoc,
|
|||
}
|
||||
Failed = true;
|
||||
}
|
||||
} else {
|
||||
ExprResult FullAssertExpr = ActOnFinishFullExpr(AssertExpr, StaticAssertLoc,
|
||||
/*DiscardedValue*/false,
|
||||
/*IsConstexpr*/true);
|
||||
if (FullAssertExpr.isInvalid())
|
||||
Failed = true;
|
||||
else
|
||||
AssertExpr = FullAssertExpr.get();
|
||||
}
|
||||
|
||||
ExprResult FullAssertExpr = ActOnFinishFullExpr(AssertExpr, StaticAssertLoc,
|
||||
/*DiscardedValue*/false,
|
||||
/*IsConstexpr*/true);
|
||||
if (FullAssertExpr.isInvalid())
|
||||
Failed = true;
|
||||
else
|
||||
AssertExpr = FullAssertExpr.get();
|
||||
|
||||
Decl *Decl = StaticAssertDecl::Create(Context, CurContext, StaticAssertLoc,
|
||||
AssertExpr, AssertMessage, RParenLoc,
|
||||
Failed);
|
||||
|
|
|
@ -461,12 +461,12 @@ struct StaticAssertRef {
|
|||
};
|
||||
|
||||
static_assert(StaticAssertRef::constVar, "index static asserts");
|
||||
// CHECK: [[@LINE-1]]:32 | static-property/C++ | constVar | c:@S@StaticAssertRef@constVar | __ZN15StaticAssertRef8constVarE | Ref | rel: 0
|
||||
// CHECK: [[@LINE-1]]:32 | static-property/C++ | constVar | c:@S@StaticAssertRef@constVar | __ZN15StaticAssertRef8constVarE | Ref,Read | rel: 0
|
||||
// CHECK: [[@LINE-2]]:15 | struct/C++ | StaticAssertRef | c:@S@StaticAssertRef | <no-cgname> | Ref | rel: 0
|
||||
|
||||
void staticAssertInFn() {
|
||||
static_assert(StaticAssertRef::constVar, "index static asserts");
|
||||
// CHECK: [[@LINE-1]]:34 | static-property/C++ | constVar | c:@S@StaticAssertRef@constVar | __ZN15StaticAssertRef8constVarE | Ref,RelCont | rel: 1
|
||||
// CHECK: [[@LINE-1]]:34 | static-property/C++ | constVar | c:@S@StaticAssertRef@constVar | __ZN15StaticAssertRef8constVarE | Ref,Read,RelCont | rel: 1
|
||||
// CHECK-NEXT: RelCont | staticAssertInFn | c:@F@staticAssertInFn#
|
||||
// CHECK: [[@LINE-3]]:17 | struct/C++ | StaticAssertRef | c:@S@StaticAssertRef | <no-cgname> | Ref,RelCont | rel: 1
|
||||
// CHECK-NEXT: RelCont | staticAssertInFn | c:@F@staticAssertInFn#
|
||||
|
|
Loading…
Reference in New Issue