[libcxx] r302380 - Fix two test failures caused by Windows mangling of function types.
Eric Fiselier via cfe-commits
cfe-commits at lists.llvm.org
Sun May 7 14:15:28 PDT 2017
Author: ericwf
Date: Sun May 7 16:15:28 2017
New Revision: 302380
URL: http://llvm.org/viewvc/llvm-project?rev=302380&view=rev
Log:
Fix two test failures caused by Windows mangling of function types.
On Windows the function template `template <class T> void test()` has
the same mangled name when instantiated with the distinct types `void()`
and `void() noexcept`. When this occurs Clang emits an error. This error
was causing two type-traits tests to fail.
However this can be worked around by using class templates instead of
function templates, which is what this patch does to fix the errors.
Modified:
libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.cat/is_function.pass.cpp
libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp
Modified: libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.cat/is_function.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.cat/is_function.pass.cpp?rev=302380&r1=302379&r2=302380&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.cat/is_function.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.cat/is_function.pass.cpp Sun May 7 16:15:28 2017
@@ -16,9 +16,13 @@
#include "test_macros.h"
+// NOTE: On Windows the function `test_is_function<void()>` and
+// `test_is_function<void() noexcept> has the same mangled despite being
+// a distinct instantiation. This causes Clang to emit an error. However
+// structs do not have this problem.
+
template <class T>
-void test_is_function()
-{
+struct test_is_function {
static_assert( std::is_function<T>::value, "");
static_assert( std::is_function<const T>::value, "");
static_assert( std::is_function<volatile T>::value, "");
@@ -29,11 +33,10 @@ void test_is_function()
static_assert( std::is_function_v<volatile T>, "");
static_assert( std::is_function_v<const volatile T>, "");
#endif
-}
+};
template <class T>
-void test_is_not_function()
-{
+struct test_is_not_function {
static_assert(!std::is_function<T>::value, "");
static_assert(!std::is_function<const T>::value, "");
static_assert(!std::is_function<volatile T>::value, "");
@@ -44,7 +47,7 @@ void test_is_not_function()
static_assert(!std::is_function_v<volatile T>, "");
static_assert(!std::is_function_v<const volatile T>, "");
#endif
-}
+};
class Empty
{
Modified: libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp?rev=302380&r1=302379&r2=302380&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp Sun May 7 16:15:28 2017
@@ -14,9 +14,12 @@
#include <type_traits>
#include "test_macros.h"
+// NOTE: On Windows the function `test_is_member_function<void()>` and
+// `test_is_member_function<void() noexcept> has the same mangled despite being
+// a distinct instantiation. This causes Clang to emit an error. However
+// structs do not have this problem.
template <class T>
-void test_member_function_pointer_imp()
-{
+struct test_member_function_pointer_imp {
static_assert(!std::is_void<T>::value, "");
#if TEST_STD_VER > 11
static_assert(!std::is_null_pointer<T>::value, "");
@@ -33,16 +36,16 @@ void test_member_function_pointer_imp()
static_assert(!std::is_union<T>::value, "");
static_assert(!std::is_class<T>::value, "");
static_assert(!std::is_function<T>::value, "");
-}
+};
template <class T>
-void test_member_function_pointer()
+struct test_member_function_pointer :
+ test_member_function_pointer_imp<T>,
+ test_member_function_pointer_imp<const T>,
+ test_member_function_pointer_imp<volatile T>,
+ test_member_function_pointer_imp<const volatile T>
{
- test_member_function_pointer_imp<T>();
- test_member_function_pointer_imp<const T>();
- test_member_function_pointer_imp<volatile T>();
- test_member_function_pointer_imp<const volatile T>();
-}
+};
class Class
{
More information about the cfe-commits
mailing list