aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CGDecl.cpp
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2019-04-24 02:23:30 +0000
committerEric Fiselier <eric@efcs.ca>2019-04-24 02:23:30 +0000
commitadd16a8da9ccd07eabda2dffd0d32188f07da09c (patch)
tree4e300d103314248bfc7caf19a91ee8b872c78210 /clang/lib/CodeGen/CGDecl.cpp
parent42a22370f2b7d83b9041498831fce804c1659628 (diff)
downloadllvm-add16a8da9ccd07eabda2dffd0d32188f07da09c.zip
llvm-add16a8da9ccd07eabda2dffd0d32188f07da09c.tar.gz
llvm-add16a8da9ccd07eabda2dffd0d32188f07da09c.tar.bz2
[Builtins] Implement __builtin_is_constant_evaluated for use in C++2a
Summary: This patch implements `__builtin_is_constant_evaluated` as specifier by [P0595R2](https://wg21.link/p0595r2). It is built on the back of Bill Wendling's work for `__builtin_constant_p()`. More tests to come, but early feedback is appreciated. I plan to implement warnings for common mis-usages like those belowe in a following patch: ``` void foo(int x) { if constexpr (std::is_constant_evaluated())) { // condition is always `true`. Should use plain `if` instead. foo_constexpr(x); } else { foo_runtime(x); } } ``` Reviewers: rsmith, MaskRay, bruno, void Reviewed By: rsmith Subscribers: dexonsmith, zoecarver, fdeazeve, kristina, cfe-commits Differential Revision: https://reviews.llvm.org/D55500 llvm-svn: 359067
Diffstat (limited to 'clang/lib/CodeGen/CGDecl.cpp')
-rw-r--r--clang/lib/CodeGen/CGDecl.cpp3
1 files changed, 2 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp
index aea99dbb..a5c0224 100644
--- a/clang/lib/CodeGen/CGDecl.cpp
+++ b/clang/lib/CodeGen/CGDecl.cpp
@@ -1783,7 +1783,8 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
}
llvm::Constant *constant = nullptr;
- if (emission.IsConstantAggregate || D.isConstexpr()) {
+ if (emission.IsConstantAggregate || D.isConstexpr() ||
+ D.isUsableInConstantExpressions(getContext())) {
assert(!capturedByInit && "constant init contains a capturing block?");
constant = ConstantEmitter(*this).tryEmitAbstractForInitializer(D);
if (constant && trivialAutoVarInit !=