summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGenCXX
diff options
context:
space:
mode:
authorIsmail Pazarbasi <ismail.pazarbasi@gmail.com>2016-09-07 18:24:54 +0000
committerIsmail Pazarbasi <ismail.pazarbasi@gmail.com>2016-09-07 18:24:54 +0000
commit4a00774e59c71864e8d65b5dbdb42b3cb84e77b5 (patch)
tree14df9d464d067cf8bc78c53debde873d562bda2f /clang/test/CodeGenCXX
parentf100d4e93dde41d0c2a77e20e4c215c329e5e36f (diff)
downloadbcm5719-llvm-4a00774e59c71864e8d65b5dbdb42b3cb84e77b5.tar.gz
bcm5719-llvm-4a00774e59c71864e8d65b5dbdb42b3cb84e77b5.zip
Try contextually converting condition of constexpr if to Boolean value
Summary: C++1z 6.4.1/p2: If the if statement is of the form if constexpr, the value of the condition shall be a contextually converted constant expression of type bool [...] C++1z 5.20/p4: [...] A contextually converted constant expression of type bool is an expression, contextually converted to bool (Clause4), where the converted expression is a constant expression and the conversion sequence contains only the conversions above. [...] Contextually converting result of an expression `e` to a Boolean value requires `bool t(e)` to be well-formed. An explicit conversion function is only considered as a user-defined conversion for direct-initialization, which is essentially what //contextually converted to bool// requires. Also, fixes PR28470. Reviewers: rsmith Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D24158 llvm-svn: 280838
Diffstat (limited to 'clang/test/CodeGenCXX')
-rw-r--r--clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp b/clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp
index 80a397f51e9..14695363b33 100644
--- a/clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp
+++ b/clang/test/CodeGenCXX/cxx1z-constexpr-if.cpp
@@ -2,7 +2,15 @@
void should_be_used_1();
void should_be_used_2();
+void should_be_used_3();
void should_not_be_used();
+
+struct A {
+ constexpr explicit operator bool() const {
+ return true;
+ }
+};
+
void f() {
if constexpr (false)
should_not_be_used();
@@ -15,7 +23,12 @@ void f() {
goto foo;
foo: should_not_be_used();
}
+ if constexpr (A())
+ should_be_used_3();
+ else
+ should_not_be_used();
}
// CHECK: should_be_used_1
// CHECK: should_be_used_2
+// CHECK: should_be_used_3
OpenPOWER on IntegriCloud