Fix for PR17606 - result_of (and INVOKE) works incorrectly for member function pointers with ref qualifiers. Also a drive-by fix for common_type in C++03 mode. Thanks to Michel Morin for the bug report and the proposed fix.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@201101 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
50
test/utilities/function.objects/func.require/invoke.pass.cpp
Normal file
50
test/utilities/function.objects/func.require/invoke.pass.cpp
Normal file
@@ -0,0 +1,50 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// [func.require]
|
||||
|
||||
// INVOKE
|
||||
#if __cplusplus < 201103L
|
||||
int main () {} // no __invoke in C++03
|
||||
#else
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
template <typename T, int N>
|
||||
struct Array
|
||||
{
|
||||
typedef T type[N];
|
||||
};
|
||||
|
||||
struct Type
|
||||
{
|
||||
Array<char, 1>::type& f1();
|
||||
Array<char, 2>::type& f2() const;
|
||||
|
||||
Array<char, 1>::type& g1() &;
|
||||
Array<char, 2>::type& g2() const &;
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
Array<char, 3>::type& g3() &&;
|
||||
Array<char, 4>::type& g4() const &&;
|
||||
#endif
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
static_assert(sizeof(std::__invoke(&Type::f1, std::declval<Type >())) == 1, "");
|
||||
static_assert(sizeof(std::__invoke(&Type::f2, std::declval<Type const >())) == 2, "");
|
||||
|
||||
static_assert(sizeof(std::__invoke(&Type::g1, std::declval<Type &>())) == 1, "");
|
||||
static_assert(sizeof(std::__invoke(&Type::g2, std::declval<Type const &>())) == 2, "");
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
static_assert(sizeof(std::__invoke(&Type::g3, std::declval<Type &&>())) == 3, "");
|
||||
static_assert(sizeof(std::__invoke(&Type::g4, std::declval<Type const&&>())) == 4, "");
|
||||
#endif
|
||||
}
|
||||
#endif
|
Reference in New Issue
Block a user