Index: test/std/utilities/allocator.adaptor/allocator.adaptor.members/construct_pair.pass.cpp =================================================================== --- test/std/utilities/allocator.adaptor/allocator.adaptor.members/construct_pair.pass.cpp +++ test/std/utilities/allocator.adaptor/allocator.adaptor.members/construct_pair.pass.cpp @@ -39,6 +39,7 @@ using SA = std::scoped_allocator_adaptor; static_assert(std::uses_allocator >::value, ""); Pair * ptr = (Pair*)std::malloc(sizeof(Pair)); + assert(ptr); Alloc CA(P); SA A(CA); A.construct(ptr); @@ -61,6 +62,7 @@ using SA = std::scoped_allocator_adaptor; static_assert(std::uses_allocator >::value, ""); Pair * ptr = (Pair*)std::malloc(sizeof(Pair)); + assert(ptr); Alloc CA(P); SA A(CA); A.construct(ptr); @@ -77,7 +79,6 @@ void test_with_inner_alloc() { - using VoidAlloc1 = CountingAllocator; using VoidAlloc2 = CountingAllocator; AllocController POuter; @@ -93,6 +94,7 @@ static_assert(!std::uses_allocator::value, ""); static_assert(std::uses_allocator::value, ""); Pair * ptr = (Pair*)std::malloc(sizeof(Pair)); + assert(ptr); Outer O(POuter); Inner I(PInner); SA A(O, I); @@ -119,6 +121,7 @@ static_assert(!std::uses_allocator::value, ""); static_assert(std::uses_allocator::value, ""); Pair * ptr = (Pair*)std::malloc(sizeof(Pair)); + assert(ptr); Outer O(POuter); Inner I(PInner); SA A(O, I); 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: