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

--- Comment #6 from etherice <scottbaldwin at gmail dot com> ---
(In reply to Jonathan Wakely from comment #4)
> Until someone analyses it and convinces themselves it's a bug.
> 
> Not providing a complete testcase doesn't help. Code missing headers, even
> standard ones, is not complete, and certainly doesn't compile "out of the
> box" because I need to add headers. http://gcc.gnu.org/bugs/ clearly says
> not to leave headers out, why should I have to figure out which headers you
> failed to include in the testcase to analyse your bug report?

----------------------------------------

1) Did you see the reply from Daniel Krügler? He included a complete example.

----------------------------------------

2) My example was complete except for needing a couple #includes for <iostream>
and <type_traits>. Here it is w/ those includes:

#include <type_traits>
#include <iostream>

template<bool BoolVal, char CharVal>
struct Foo {};

template<typename... Ts>
struct is_instantiation_of__nontypes
{
    template<template<Ts...> class TT, typename T>
    struct check : std::false_type {};

    template<template<Ts...> class TT, Ts... Args>
    struct check<TT, TT<Args...>> : std::true_type {};
};

int main() {
    using FooInstantiation = Foo<false, 'x'>;
    std::cout << ((is_instantiation_of__nontypes<bool, char>::check<Foo,
FooInstantiation>::value) ? "yes" : "no") << std::endl;
}

----------------------------------------

3) clang version 3.3 (trunk 176796) compiles it fine and produces the correct
output of "yes", while gcc (all versions) blow up with some variant of:

error: ‘Ts ...’ is not a valid type for a template non-type parameter
   struct check<TT, TT<Args...>> : std::true_type {};
                           ^
error: template argument 2 is invalid
   struct check<TT, TT<Args...>> : std::true_type {};
                              ^
error: type/value mismatch at argument 1 in template parameter list for
‘template<class ... Ts> template<template<template<Ts ...<anonymous> > class
TT, class T> template<class ... Ts> template<Ts ...<anonymous> > class TT,
class T> struct is_instantiation_of__nontypes<Ts>::check’
   std::cout << ((is_instantiation_of__nontypes<bool, char>::check<Foo,
FooInstantiation>::value) ? "yes" : "no") << std::endl;

error:   expected a template of type ‘template<class ... Ts> template<Ts
...<anonymous> > class TT’, got ‘template<bool BoolVal, char CharVal> struct
Foo’

----------------------------------------

4) Convincing oneself that this is a bug should not be difficult. Section
14.1.15 of the C++11 standard makes it very clear that this code contains a
valid expansion of a non-type template parameter pack declared in a different
template-parameter-list. It even offers a very similar example, taken directly
from § 14.1.15:

template<class... T> struct value_holder {
template<T... Values> apply { }; // Values is a non-type template parameter
pack
// and a pack expansion
};

Reply via email to