Bug 61178 - expansion pattern '#'nontype_argument_pack' not supported by dump_expr#
Summary: expansion pattern '#'nontype_argument_pack' not supported by dump_expr#
Status: RESOLVED DUPLICATE of bug 51501
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.8.0
: P3 minor
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2014-05-13 15:58 UTC by tower120
Modified: 2014-05-13 19:56 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description tower120 2014-05-13 15:58:26 UTC
I got strange error:

expansion pattern '#'nontype_argument_pack' not supported by dump_expr#

With the following code:
http://coliru.stacked-crooked.com/a/bbacd7e9bec149f0

------------------------------------------------------------------------------
#include <iostream>
#include <utility>
#include <type_traits>
#include <typeinfo>

using namespace std;


struct Void{
    static constexpr int size = 0;
};

template<typename T0, typename T1>
class Variadic{
private:
    typedef Variadic<T0, T1> thisT;

public:
    /** Do not use this constructor */
    Variadic(T0 el0, T1 el1): value(el0), next(el1) {}

    // avoiding decltype
    typedef T0 valueT;
    T0 value;

    typedef T1 nextT;
    T1 next; // may be next pair

    /**
     * Chainable method
     */
    template<typename ValueT>
    /*constexpr*/ inline Variadic<ValueT, thisT> add(ValueT value){
        return Variadic<ValueT, thisT>(value, (*this) );
    }

};

template<typename T>
static inline Variadic<T, Void> make_variadic(T value){
    return Variadic<T, Void>(value, Void());
}




/// ERROR IS HERE!
template<typename Arg0, typename... Args>
static inline auto make_variadic(Arg0 value0, Args... values) -> decltype( fill(make_variadic<Arg0>(value0), values...) ) {
    return fill(make_variadic<Arg0>(value0), values...);
}


///  THIS ONE BELOW, WORKS FINE
/*
template<typename Arg0, typename... Args>
static inline auto make_variadic(Arg0 value0, Args... values) -> decltype(fill(Variadic<Arg0, Void>(value0, Void()), values...)) {
    return fill(Variadic<Arg0, Void>(value0, Void()), values...);
}*/


template<typename T, typename Arg0, typename... Args>
static inline auto fill(T self, Arg0 value, Args... values) -> decltype(fill(self.add(value), values...)){
    return fill(self.add(value), values...);
}

template<typename T, typename Arg0>
static inline auto fill(T self, Arg0 value) -> decltype(self.add(value)){
    return self.add(value);
}



int main()
{
    auto list = make_variadic(1, 2, 3);
}


------------------------------------------------------------------------------
Command line from coliru:
g++-4.8 -std=c++11  -O2 -Wall -Wextra -pedantic -pthread -pedantic-errors main.cpp -lm  && ./a.out


Clang compile this without errors.


If I replace make_variadic call (see code above) with function body, it works ok.
Comment 1 tower120 2014-05-13 19:34:50 UTC
This may be related to this http://open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#1433
Comment 2 tower120 2014-05-13 19:36:03 UTC
resolved by mistake.
Comment 3 Jonathan Wakely 2014-05-13 19:56:16 UTC
yes, this is a dup of PR 59481 which is a dup of PR 51501

*** This bug has been marked as a duplicate of bug 51501 ***