Hi!

I've noticed we don't have any testcases covering manifestly constant
evaluation inside of explicit bool, tested thusly, bootstrapped/regtested on
x86_64-linux and i686-linux, committed to trunk as obvious.

2019-05-23  Jakub Jelinek  <ja...@redhat.com>

        * g++.dg/cpp2a/is-constant-evaluated8.C: New test.

--- gcc/testsuite/g++.dg/cpp2a/is-constant-evaluated8.C.jj      2019-05-22 
19:00:00.209982223 +0200
+++ gcc/testsuite/g++.dg/cpp2a/is-constant-evaluated8.C 2019-05-22 
19:05:11.425937617 +0200
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+namespace std {
+  constexpr inline bool
+  is_constant_evaluated () noexcept
+  {
+    return __builtin_is_constant_evaluated ();
+  }
+}
+
+struct A { explicit (!__builtin_is_constant_evaluated ()) A (int); };  // { 
dg-warning "'explicit\\(bool\\)' only available with" "" { target c++17_down } }
+struct B { explicit (!std::is_constant_evaluated ()) B (int); };       // { 
dg-warning "'explicit\\(bool\\)' only available with" "" { target c++17_down } }
+struct C { explicit (__builtin_is_constant_evaluated ()) C (int); };   // { 
dg-warning "'explicit\\(bool\\)' only available with" "" { target c++17_down } }
+struct D { explicit (std::is_constant_evaluated ()) D (int); };                
// { dg-warning "'explicit\\(bool\\)' only available with" "" { target 
c++17_down } }
+A a = 1;
+B b = 2;
+C c = 3;       // { dg-error "conversion from 'int' to non-scalar type 'C' 
requested" }
+D d = 4;       // { dg-error "conversion from 'int' to non-scalar type 'D' 
requested" }

        Jakub

Reply via email to