https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66092

            Bug ID: 66092
           Summary: Concept can't check variadic template arguments
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: yingpo.liao at gmail dot com
  Target Milestone: ---

Concept can't check variadic template arguments (r222891).

The example code shows an implementation of a concept to check if all types are
the same via variadic template arguments. It will be okay if we directly print
out the results, but will fail (internal compiler error) if we apply the
concept to real cases, i.e., a foo() function. 

$ svn info

Path: .
Working Copy Root Path:
/Users/liao/Downloads/gcc-branch-c++-concepts/c++-concepts
URL: svn://gcc.gnu.org/svn/gcc/branches/c++-concepts
Relative URL: ^/branches/c++-concepts
Repository Root: svn://gcc.gnu.org/svn/gcc
Repository UUID: 138bc75d-0d04-0410-961f-82ee72b054a4
Revision: 222891
Node Kind: directory
Schedule: normal
Last Changed Author: asutton
Last Changed Rev: 222891
Last Changed Date: 2015-05-07 15:25:15 -0500 (Thu, 07 May 2015)

$ cat test.cpp

#include <iostream>
#include <type_traits>

template <typename T, typename U, typename... Args>
requires (sizeof...(Args) == 0)
  constexpr decltype(auto) check()
  {
    return std::integral_constant<bool, __is_same_as(T, U)>();
  }

template <typename T, typename U, typename... Args>
requires (sizeof...(Args) > 0)
  constexpr decltype(auto) check()
  {
    return std::integral_constant<bool, __is_same_as(T, U)
        && decltype(check<U, Args...>())::value>();
  }

template <typename T, typename U, typename... Args>
  concept bool Same()
  {
    return decltype(check<T, U, Args...>())::value;
  }

template <typename... Args>
requires Same<Args...>()
  void foo( Args... args ) {}

int main()
{
  // OK: print "true"
  std::cout << std::boolalpha << Same<int, int, int>() << std::endl;
  // ERROR
  foo(1, 2, 3);
  return 0;
}

$ g++ -std=c++1z test.cpp  -o test

test.cpp:22:41: internal compiler error: tree check: accessed elt 2 of tree_vec
with 1 elts in tsubst, at cp/pt.c:12556
     return decltype(check<T, U, Args...>())::value;
                                         ^

test.cpp:22:41: internal compiler error: Abort trap: 6
g++: internal compiler error: Abort trap: 6 (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

Reply via email to