diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-05-23 17:21:55 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-05-23 17:21:55 +0000 |
commit | b3d96882ec01a0c98e447b392f20a5d25f77a0ce (patch) | |
tree | 2d2053af6eae1d301d008ece2258b1a2ab57d3e8 /clang/test | |
parent | cd3ebfe293d02e18397356daa21517e0fa06c32a (diff) | |
download | bcm5719-llvm-b3d96882ec01a0c98e447b392f20a5d25f77a0ce.tar.gz bcm5719-llvm-b3d96882ec01a0c98e447b392f20a5d25f77a0ce.zip |
Clang support for __is_assignable intrinsic
MSVC now supports the __is_assignable type trait intrinsic,
to enable easier and more efficient implementation of the
Standard Library's is_assignable trait.
As of Visual Studio 2015 Update 3, the VC Standard Library
implementation uses the new intrinsic unconditionally.
The implementation is pretty straightforward due to the previously
existing is_nothrow_assignable and is_trivially_assignable.
We handle __is_assignable via the same code as the other two except
that we skip the extra checks for nothrow or triviality.
Patch by Dave Bartolomeo!
Differential Revision: http://reviews.llvm.org/D20492
llvm-svn: 270458
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/Lexer/has_feature_type_traits.cpp | 5 | ||||
-rw-r--r-- | clang/test/PCH/cxx-traits.cpp | 1 | ||||
-rw-r--r-- | clang/test/PCH/cxx-traits.h | 1 | ||||
-rw-r--r-- | clang/test/SemaCXX/type-traits.cpp | 43 |
4 files changed, 50 insertions, 0 deletions
diff --git a/clang/test/Lexer/has_feature_type_traits.cpp b/clang/test/Lexer/has_feature_type_traits.cpp index f772d6d1845..6636e7b3963 100644 --- a/clang/test/Lexer/has_feature_type_traits.cpp +++ b/clang/test/Lexer/has_feature_type_traits.cpp @@ -45,6 +45,11 @@ int is_abstract(); #endif // CHECK: int is_abstract(); +#if __has_feature(is_assignable) +int is_assignable(); +#endif +// CHECK: int is_assignable(); + #if __has_feature(is_base_of) int is_base_of(); #endif diff --git a/clang/test/PCH/cxx-traits.cpp b/clang/test/PCH/cxx-traits.cpp index fc3e1335dd6..b0f1d9d2c3d 100644 --- a/clang/test/PCH/cxx-traits.cpp +++ b/clang/test/PCH/cxx-traits.cpp @@ -18,6 +18,7 @@ bool copy_construct_int = n::is_trivially_constructible<int, const int&>::value; bool _is_abstract_result = __is_abstract(int); bool _is_arithmetic_result = __is_arithmetic(int); bool _is_array_result = __is_array(int); +bool _is_assignable_result = __is_assignable(int, int); bool _is_base_of_result = __is_base_of(int, int); bool _is_class_result = __is_class(int); bool _is_complete_type_result = __is_complete_type(int); diff --git a/clang/test/PCH/cxx-traits.h b/clang/test/PCH/cxx-traits.h index 21324768186..1d7d40450fe 100644 --- a/clang/test/PCH/cxx-traits.h +++ b/clang/test/PCH/cxx-traits.h @@ -20,6 +20,7 @@ struct is_trivially_constructible { struct __is_abstract {}; // expected-warning {{made available}} struct __is_arithmetic {}; // expected-warning {{made available}} struct __is_array {}; // expected-warning {{made available}} +struct __is_assignable {}; // expected-warning {{made available}} struct __is_base_of {}; // expected-warning {{made available}} struct __is_class {}; // expected-warning {{made available}} struct __is_complete_type {}; // expected-warning {{made available}} diff --git a/clang/test/SemaCXX/type-traits.cpp b/clang/test/SemaCXX/type-traits.cpp index 69760fd6bd0..c53b02774ac 100644 --- a/clang/test/SemaCXX/type-traits.cpp +++ b/clang/test/SemaCXX/type-traits.cpp @@ -1514,6 +1514,9 @@ void has_nothrow_move_assign() { { int arr[T(__is_nothrow_assignable(HasNoThrowMoveAssign, HasNoThrowMoveAssign))]; } { int arr[F(__is_nothrow_assignable(HasThrowMoveAssign, HasThrowMoveAssign))]; } + + { int arr[T(__is_assignable(HasNoThrowMoveAssign, HasNoThrowMoveAssign))]; } + { int arr[T(__is_assignable(HasThrowMoveAssign, HasThrowMoveAssign))]; } } void has_trivial_move_assign() { @@ -1974,6 +1977,46 @@ void trivial_checks() TrivialMoveButNotCopy)))]; } { int arr[T((__is_trivially_assignable(TrivialMoveButNotCopy&, TrivialMoveButNotCopy&&)))]; } + { int arr[T((__is_trivially_assignable(int&, int)))]; } + { int arr[T((__is_trivially_assignable(int&, int&)))]; } + { int arr[T((__is_trivially_assignable(int&, int&&)))]; } + { int arr[T((__is_trivially_assignable(int&, const int&)))]; } + { int arr[T((__is_trivially_assignable(POD&, POD)))]; } + { int arr[T((__is_trivially_assignable(POD&, POD&)))]; } + { int arr[T((__is_trivially_assignable(POD&, POD&&)))]; } + { int arr[T((__is_trivially_assignable(POD&, const POD&)))]; } + { int arr[T((__is_trivially_assignable(int*&, int*)))]; } + { int arr[T((__is_trivially_assignable(AllDefaulted, + const AllDefaulted &)))]; } + { int arr[T((__is_trivially_assignable(AllDefaulted, + AllDefaulted &&)))]; } + + { int arr[F((__is_assignable(int *&, float *)))]; } + { int arr[T((__is_assignable(HasCopyAssign &, HasCopyAssign)))]; } + { int arr[T((__is_assignable(HasCopyAssign &, HasCopyAssign &)))]; } + { int arr[T((__is_assignable(HasCopyAssign &, const HasCopyAssign &)))]; } + { int arr[T((__is_assignable(HasCopyAssign &, HasCopyAssign &&)))]; } + { int arr[T((__is_assignable(TrivialMoveButNotCopy &, + TrivialMoveButNotCopy &)))]; } + { int arr[T((__is_assignable(TrivialMoveButNotCopy &, + const TrivialMoveButNotCopy &)))]; } + { int arr[F((__is_assignable(AllDeleted, + const AllDeleted &)))]; } + { int arr[F((__is_assignable(AllDeleted, + AllDeleted &&)))]; } + { int arr[T((__is_assignable(ExtDefaulted, + const ExtDefaulted &)))]; } + { int arr[T((__is_assignable(ExtDefaulted, + ExtDefaulted &&)))]; } + + { int arr[T((__is_assignable(HasDefaultTrivialCopyAssign &, + HasDefaultTrivialCopyAssign &)))]; } + { int arr[T((__is_assignable(HasDefaultTrivialCopyAssign &, + const HasDefaultTrivialCopyAssign &)))]; } + { int arr[T((__is_assignable(TrivialMoveButNotCopy &, + TrivialMoveButNotCopy)))]; } + { int arr[T((__is_assignable(TrivialMoveButNotCopy &, + TrivialMoveButNotCopy &&)))]; } } void constructible_checks() { |