summaryrefslogtreecommitdiff
path: root/test/Parser/decomposed-condition.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/Parser/decomposed-condition.cpp')
-rw-r--r--test/Parser/decomposed-condition.cpp61
1 files changed, 61 insertions, 0 deletions
diff --git a/test/Parser/decomposed-condition.cpp b/test/Parser/decomposed-condition.cpp
new file mode 100644
index 0000000000000..c41c82292e8de
--- /dev/null
+++ b/test/Parser/decomposed-condition.cpp
@@ -0,0 +1,61 @@
+// RUN: %clang_cc1 -std=c++1z %s -verify
+
+struct Na {
+ bool flag;
+ float data;
+};
+
+struct Rst {
+ bool flag;
+ float data;
+ explicit operator bool() const {
+ return flag;
+ }
+};
+
+Rst f();
+Na g();
+
+namespace CondInIf {
+void h() {
+ if (auto [ok, d] = f()) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}}
+ ;
+ if (auto [ok, d] = g()) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}} expected-error {{value of type 'Na' is not contextually convertible to 'bool'}}
+ ;
+}
+} // namespace CondInIf
+
+namespace CondInWhile {
+void h() {
+ while (auto [ok, d] = f()) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}}
+ ;
+ while (auto [ok, d] = g()) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}} expected-error {{value of type 'Na' is not contextually convertible to 'bool'}}
+ ;
+}
+} // namespace CondInWhile
+
+namespace CondInFor {
+void h() {
+ for (; auto [ok, d] = f();) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}}
+ ;
+ for (; auto [ok, d] = g();) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}} expected-error {{value of type 'Na' is not contextually convertible to 'bool'}}
+ ;
+}
+} // namespace CondInFor
+
+struct IntegerLike {
+ bool flag;
+ float data;
+ operator int() const {
+ return int(data);
+ }
+};
+
+namespace CondInSwitch {
+void h(IntegerLike x) {
+ switch (auto [ok, d] = x) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}}
+ ;
+ switch (auto [ok, d] = g()) // expected-warning {{ISO C++17 does not permit structured binding declaration in a condition}} expected-error {{statement requires expression of integer type ('Na' invalid)}}
+ ;
+}
+} // namespace CondInSwitch