blob: f25a9c9984ccaa9bec1d523f6ea2e3025ff1c281 [file] [log] [blame]
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03
// Verify TEST_WORKAROUND_C1XX_EMPTY_PARAMETER_PACK_EXPANSION.
#include <type_traits>
#include "test_workarounds.h"
template<class T>
struct identity {
using type = T;
};
template<class...> struct list {};
// C1XX believes this function template is not viable when LArgs is an empty
// parameter pack.
template <class ...LArgs>
int f2(typename identity<LArgs>::type..., int i) {
return i;
}
#ifdef TEST_WORKAROUND_C1XX_EMPTY_PARAMETER_PACK_EXPANSION
// C1XX believes this function template *is* viable when LArgs is an empty
// parameter pack. Conforming compilers believe the two overloads are
// ambiguous when LArgs is an empty pack.
template <class ...LArgs>
int f2(int i) {
return i;
}
#endif
template <class ...LArgs, class ...Args>
int f1(list<LArgs...>, Args&&... args) {
return f2<LArgs const&...>(args...);
}
int main() {
f1(list<>{}, 42);
}