Summary:
This feature was discussed but not yet proposed. It allows a structured binding to appear as a //condition//
if (auto [ok, val] = f(...))
So the user can save an extra //condition// if the statement can test the value to-be-decomposed instead. Formally, it makes the value of the underlying object of the structured binding declaration also the value of a //condition// that is an initialized declaration.
Considering its logicality which is entirely evident from its trivial implementation, I think it might be acceptable to land it as an extension for now before I write the paper.
Reviewers: rsmith, faisalv, aaron.ballman
Reviewed By: rsmith
Subscribers: aaron.ballman, cfe-commits
Differential Revision: https://reviews.llvm.org/D39284
llvm-svn: 320011
62 lines
1.9 KiB
C++
62 lines
1.9 KiB
C++
// 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
|