• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright Louis Dionne 2013-2017
2 // Distributed under the Boost Software License, Version 1.0.
3 // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
4 
5 #include <boost/hana/bool.hpp>
6 #include <boost/hana/integral_constant.hpp>
7 namespace hana = boost::hana;
8 
9 
10 /*
11 When we use `int_<...>` in a template, Clang 3.5 says:
12 
13 --------------------------------
14 include/boost/hana/integral_constant.hpp:80:20: error: constexpr variable 'int_<1>' must be initialized by a constant expression
15     constexpr auto int_ = integral<int, i>;
16                    ^      ~~~~~~~~~~~~~~~~
17 test/integral/constexpr_bug.cpp:41:37: note: in instantiation of variable template specialization 'boost::hana::int_' requested here
18 constexpr auto check_int() { return int_<1>; }
19                                     ^
20 include/boost/hana/integral_constant.hpp:80:27: note: subexpression not valid in a constant expression
21     constexpr auto int_ = integral<int, i>;
22                           ^
23 include/boost/hana/integral_constant.hpp:80:27: note: in call to 'integral_type(integral)'
24 --------------------------------
25 
26 if we define int_ & friends like
27 
28     template <int i>
29     constexpr auto int_ = integral<int, i>;
30 
31 Instead, we do
32 
33     template <int i>
34     constexpr decltype(integral<int, i>) int_{};
35 
36 which is equivalent but uglier. Note that everything works just fine when
37 we're not in a template.
38 */
39 
40 template <typename T>
check_int()41 constexpr auto check_int() { return hana::int_c<1>; }
42 
43 template <typename T>
check_true()44 constexpr auto check_true() { return hana::true_c; }
45 
46 template <typename T>
check_size_t()47 constexpr auto check_size_t() { return hana::size_c<0>; }
48 
49 
main()50 int main() { }
51