| // PR c++/89513 |
| // { dg-do compile { target c++14 } } |
| // { dg-options "" } |
| |
| constexpr int foo () |
| try { // { dg-warning "function-try-block body of 'constexpr' function only available with" "" { target c++17_down } } |
| int a = 1; |
| for (int i = 0; i < 10; i++) |
| a += i; |
| return a; |
| } catch (...) { |
| return -1; |
| } |
| |
| constexpr int bar () |
| try { // { dg-warning "function-try-block body of 'constexpr' function only available with" "" { target c++17_down } } |
| int a = 0; |
| for (int i = 0; i < 9; i++) |
| try { // { dg-warning "'try' in 'constexpr' function only available with" "" { target c++17_down } } |
| a += i; |
| } catch (int) { |
| return -1; |
| } |
| return a; |
| } catch (...) { |
| return -2; |
| } |
| |
| constexpr bool baz () |
| { |
| try { return true; } catch (...) { return false; } // { dg-warning "'try' in 'constexpr' function only available with" "" { target c++17_down } } |
| } |
| |
| struct S { |
| constexpr S () try : m (1) // { dg-warning "function-try-block body of 'constexpr' constructor only available with" "" { target c++17_down } } |
| { |
| try { // { dg-warning "'try' in 'constexpr' function only available with" "" { target c++17_down } } |
| m += 2; |
| } catch (int) { |
| m = -1; |
| } |
| } catch (...) { |
| m = -2; |
| } |
| int m; |
| constexpr int get () const { return m; } |
| }; |
| |
| struct T { |
| constexpr T () |
| try { // { dg-warning "function-try-block body of 'constexpr' constructor only available with" "" { target c++17_down } } |
| } catch (...) { |
| } |
| }; |
| |
| static_assert (foo () == 46, ""); |
| static_assert (bar () == 36, ""); |
| static_assert (baz (), ""); |
| constexpr S s; |
| static_assert (s.get () == 3, ""); |
| constexpr T t; |