Index: test/support/test.workarounds/c1xx_empty_parameter_pack_expansion.pass.cpp =================================================================== --- /dev/null +++ test/support/test.workarounds/c1xx_empty_parameter_pack_expansion.pass.cpp @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// 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 + +#include "test_workarounds.h" + +template +struct identity { + using type = T; +}; + +template struct list {}; + +// C1XX believes this function template is not viable when LArgs is an empty +// parameter pack. +template +int f2(typename identity::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 +int f2(int i) { + return i; +} +#endif + +template +int f1(list, Args&&... args) { + return f2(args...); +} + +int main() { + f1(list<>{}, 42); +} Index: test/support/test_workarounds.h =================================================================== --- test/support/test_workarounds.h +++ test/support/test_workarounds.h @@ -20,6 +20,7 @@ #if defined(TEST_COMPILER_C1XX) # define TEST_WORKAROUND_C1XX_BROKEN_NULLPTR_CONVERSION_OPERATOR # define TEST_WORKAROUND_C1XX_BROKEN_IS_TRIVIALLY_COPYABLE +# define TEST_WORKAROUND_C1XX_EMPTY_PARAMETER_PACK_EXPANSION # ifndef _MSC_EXTENSIONS # define TEST_WORKAROUND_C1XX_BROKEN_ZA_CTOR_CHECK # endif Index: test/support/uses_alloc_types.hpp =================================================================== --- test/support/uses_alloc_types.hpp +++ test/support/uses_alloc_types.hpp @@ -15,6 +15,7 @@ #include #include "test_macros.h" +#include "test_workarounds.h" #include "type_id.h" // There are two forms of uses-allocator construction: @@ -256,6 +257,13 @@ return alloc; } +#ifdef TEST_WORKAROUND_C1XX_EMPTY_PARAMETER_PACK_EXPANSION + template + static CtorAlloc getAllocatorFromPackImp(CtorAlloc const& alloc) { + return alloc; + } +#endif + bool has_alloc() const { return alloc_store.get_allocator() != nullptr; } const CtorAlloc *get_alloc() const { return alloc_store.get_allocator(); } public: