http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54648

             Bug #: 54648
           Summary: constexpr function rejected as non const
    Classification: Unclassified
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: leo...@volnitsky.com


I am getting from gcc-4.8.0 20120920 for constexpr function:

error: integral expression ‘is_range<vector<int>&>()’ is not constant

With gcc-4.7.1 (and with gcc-4.8 older than a month) it compiles correctly.
This error is generated only in some particular combination of source code.  I
was not able to reproduce it in minimal example.  File main.ii is attached.

Function is_range is defined as:

------------------------------------------------------
template<typename T>     
constexpr bool   
is_range()        { return  is_range_t<T>::value; };
------------------------------------------------------

Type is_range_t defined as:

-----------------------------------------------------
        template <typename T>
struct is_range_t {
                template <
                        class U,
                        class I = typename U::const_iterator
                >   
                static int8_t
        test(U* u); 

                template <typename U>
                static int16_t
        test(...);

        enum { value  =  sizeof test <rm_qualifier<T>> (0) == 1 };
};


template<typename T, size_t N>  struct  is_range_t <T[N]> : std::true_type { };
template<typename T, size_t N>  struct  is_range_t <T(&)[N]> : std::true_type {
};
template<typename T, size_t N>  struct  is_range_t <std::array<T,N>> :
std::true_type { };

template<typename T> constexpr bool is_range() { return  is_range_t<T>::value;
};
-----------------------------------------------------

Reply via email to