[LLVMbugs] [Bug 13702] New: Static constexpr methods of template aliases do not get instantiated

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Sun Aug 26 17:08:40 PDT 2012


             Bug #: 13702
           Summary: Static constexpr methods of template aliases do not
                    get instantiated
           Product: clang
           Version: unspecified
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: C++11
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: arcata at gmail.com
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified

The following code fails with an "implicit instantiation of undefined template
'd<a<std::__1::array<int, 1> >, void>'" error:

#include <array>
#include <type_traits>

template<typename T>
struct a { static constexpr bool value() { return true; } };

template<int N>
struct b { using type = std::array<int, N>; };

template<int N>
using c = a<typename b<N>::type>;

template<typename T, typename If = void>
struct d;

template<typename T>
struct d<T, typename std::enable_if<T::value()>::type>
    static constexpr int value = 42;

//static_assert(a<std::array<int,1>>::value(), "");

static_assert(d<c<1>>::value == 42, "");

int main() {}

There appears to be an improper substitution failure in the enable_if
expression for the `d` specialization when an instance of `a` is first
referenced through the template alias `c`. Uncommenting the first static_assert
expression, which causes `a` to be instantiated directly before being used
through the template alias, causes the program to compile successfully.

Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

More information about the llvm-bugs mailing list