summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/hana/test/integral_constant/constexpr_init.cpp
blob: 0656eb6d0afc4b194def5a7e1539699d03efffdf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Copyright Louis Dionne 2013-2017
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)

#include <boost/hana/bool.hpp>
#include <boost/hana/integral_constant.hpp>
namespace hana = boost::hana;


/*
When we use `int_<...>` in a template, Clang 3.5 says:

--------------------------------
include/boost/hana/integral_constant.hpp:80:20: error: constexpr variable 'int_<1>' must be initialized by a constant expression
    constexpr auto int_ = integral<int, i>;
                   ^      ~~~~~~~~~~~~~~~~
test/integral/constexpr_bug.cpp:41:37: note: in instantiation of variable template specialization 'boost::hana::int_' requested here
constexpr auto check_int() { return int_<1>; }
                                    ^
include/boost/hana/integral_constant.hpp:80:27: note: subexpression not valid in a constant expression
    constexpr auto int_ = integral<int, i>;
                          ^
include/boost/hana/integral_constant.hpp:80:27: note: in call to 'integral_type(integral)'
--------------------------------

if we define int_ & friends like

    template <int i>
    constexpr auto int_ = integral<int, i>;

Instead, we do

    template <int i>
    constexpr decltype(integral<int, i>) int_{};

which is equivalent but uglier. Note that everything works just fine when
we're not in a template.
*/

template <typename T>
constexpr auto check_int() { return hana::int_c<1>; }

template <typename T>
constexpr auto check_true() { return hana::true_c; }

template <typename T>
constexpr auto check_size_t() { return hana::size_c<0>; }


int main() { }