diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/Lexer/has_feature_type_traits.cpp | 5 | ||||
-rw-r--r-- | clang/test/SemaCXX/type-traits.cpp | 31 |
2 files changed, 36 insertions, 0 deletions
diff --git a/clang/test/Lexer/has_feature_type_traits.cpp b/clang/test/Lexer/has_feature_type_traits.cpp index 53056a02b72..0c2cfa56c4a 100644 --- a/clang/test/Lexer/has_feature_type_traits.cpp +++ b/clang/test/Lexer/has_feature_type_traits.cpp @@ -70,6 +70,11 @@ int is_enum(); #endif // CHECK: int is_enum(); +#if __has_feature(is_final) +int is_final(); +#endif +// CHECK: int is_final(); + #if __has_feature(is_pod) int is_pod(); #endif diff --git a/clang/test/SemaCXX/type-traits.cpp b/clang/test/SemaCXX/type-traits.cpp index 0914c7cf94e..2b8714b5e05 100644 --- a/clang/test/SemaCXX/type-traits.cpp +++ b/clang/test/SemaCXX/type-traits.cpp @@ -235,6 +235,37 @@ void is_enum() { int arr[F(__is_enum(HasAnonymousUnion))]; } } +struct FinalClass final { +}; + +template<typename T> +struct PotentiallyFinal { }; + +template<typename T> +struct PotentiallyFinal<T*> final { }; + +template<> +struct PotentiallyFinal<int> final { }; + +void is_final() +{ + { int arr[T(__is_final(FinalClass))]; } + { int arr[T(__is_final(PotentiallyFinal<float*>))]; } + { int arr[T(__is_final(PotentiallyFinal<int>))]; } + + { int arr[F(__is_final(int))]; } + { int arr[F(__is_final(Union))]; } + { int arr[F(__is_final(Int))]; } + { int arr[F(__is_final(IntAr))]; } + { int arr[F(__is_final(UnionAr))]; } + { int arr[F(__is_final(Derives))]; } + { int arr[F(__is_final(ClassType))]; } + { int arr[F(__is_final(cvoid))]; } + { int arr[F(__is_final(IntArNB))]; } + { int arr[F(__is_final(HasAnonymousUnion))]; } + { int arr[F(__is_final(PotentiallyFinal<float>))]; } +} + typedef HasVirt Polymorph; struct InheritPolymorph : Polymorph {}; |