| // RUN: %clang_cc1 -std=c++1z -Wno-binding-in-condition -verify %s |
| |
| struct X { |
| bool flag; |
| int data; |
| constexpr explicit operator bool() const { |
| return flag; |
| } |
| constexpr operator int() const { |
| return data; |
| } |
| }; |
| |
| namespace CondInIf { |
| constexpr int f(X x) { |
| if (auto [ok, d] = x) |
| return d + int(ok); |
| else |
| return d * int(ok); |
| ok = {}; // expected-error {{use of undeclared identifier 'ok'}} |
| d = {}; // expected-error {{use of undeclared identifier 'd'}} |
| } |
| |
| static_assert(f({true, 2}) == 3); |
| static_assert(f({false, 2}) == 0); |
| |
| constexpr char g(char const (&x)[2]) { |
| if (auto &[a, b] = x) |
| return a; |
| else |
| return b; |
| |
| if (auto [a, b] = x) // expected-error {{an array type is not allowed here}} |
| ; |
| } |
| |
| static_assert(g("x") == 'x'); |
| } // namespace CondInIf |
| |
| namespace CondInSwitch { |
| constexpr int f(int n) { |
| switch (X s = {true, n}; auto [ok, d] = s) { |
| s = {}; |
| case 0: |
| return int(ok); |
| case 1: |
| return d * 10; |
| case 2: |
| return d * 40; |
| default: |
| return 0; |
| } |
| ok = {}; // expected-error {{use of undeclared identifier 'ok'}} |
| d = {}; // expected-error {{use of undeclared identifier 'd'}} |
| s = {}; // expected-error {{use of undeclared identifier 's'}} |
| } |
| |
| static_assert(f(0) == 1); |
| static_assert(f(1) == 10); |
| static_assert(f(2) == 80); |
| } // namespace CondInSwitch |
| |
| namespace CondInWhile { |
| constexpr int f(int n) { |
| int m = 1; |
| while (auto [ok, d] = X{n > 1, n}) { |
| m *= d; |
| --n; |
| } |
| return m; |
| return ok; // expected-error {{use of undeclared identifier 'ok'}} |
| } |
| |
| static_assert(f(0) == 1); |
| static_assert(f(1) == 1); |
| static_assert(f(4) == 24); |
| } // namespace CondInWhile |
| |
| namespace CondInFor { |
| constexpr int f(int n) { |
| int a = 1, b = 1; |
| for (X x = {true, n}; auto &[ok, d] = x; --d) { |
| if (d < 2) |
| ok = false; |
| else { |
| int x = b; |
| b += a; |
| a = x; |
| } |
| } |
| return b; |
| return d; // expected-error {{use of undeclared identifier 'd'}} |
| } |
| |
| static_assert(f(0) == 1); |
| static_assert(f(1) == 1); |
| static_assert(f(2) == 2); |
| static_assert(f(5) == 8); |
| } // namespace CondInFor |