DaveBartolomeo updated this revision to Diff 58014.
DaveBartolomeo added a comment.

Removed unnecessary braces.
Moved BTT_IsAssignable case to a more clear location.


http://reviews.llvm.org/D20492

Files:
  docs/LanguageExtensions.rst
  include/clang/Basic/TokenKinds.def
  include/clang/Basic/TypeTraits.h
  lib/Parse/ParseDeclCXX.cpp
  lib/Parse/ParseExpr.cpp
  lib/Sema/SemaExprCXX.cpp
  test/PCH/cxx-traits.cpp
  test/PCH/cxx-traits.h

Index: test/PCH/cxx-traits.h
===================================================================
--- test/PCH/cxx-traits.h
+++ test/PCH/cxx-traits.h
@@ -1,69 +1,70 @@
-// Header for PCH test cxx-traits.cpp
-
-namespace n {
-
-template<typename _Tp>
-struct __is_pod { // expected-warning {{keyword '__is_pod' will be made available as an identifier for the remainder of the translation unit}}
-  enum { __value };
-};
-
-template<typename _Tp>
-struct __is_empty { // expected-warning {{keyword '__is_empty' will be made available as an identifier for the remainder of the translation unit}}
-  enum { __value };
-};
-
-template<typename T, typename ...Args>
-struct is_trivially_constructible {
-  static const bool value = __is_trivially_constructible(T, Args...);
-};
-
-struct __is_abstract {};  // expected-warning {{made available}}
-struct __is_arithmetic {};  // expected-warning {{made available}}
-struct __is_array {};  // 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}}
-struct __is_compound {};  // expected-warning {{made available}}
-struct __is_const {};  // expected-warning {{made available}}
-struct __is_constructible {};  // expected-warning {{made available}}
-struct __is_convertible {};  // expected-warning {{made available}}
-struct __is_convertible_to {};  // expected-warning {{made available}}
-struct __is_destructible {};  // expected-warning {{made available}}
-struct __is_enum {};  // expected-warning {{made available}}
-struct __is_floating_point {};  // expected-warning {{made available}}
-struct __is_final {};  // expected-warning {{made available}}
-struct __is_function {};  // expected-warning {{made available}}
-struct __is_fundamental {};  // expected-warning {{made available}}
-struct __is_integral {};  // expected-warning {{made available}}
-struct __is_interface_class {};  // expected-warning {{made available}}
-struct __is_literal {};  // expected-warning {{made available}}
-struct __is_lvalue_expr {};  // expected-warning {{made available}}
-struct __is_lvalue_reference {};  // expected-warning {{made available}}
-struct __is_member_function_pointer {};  // expected-warning {{made available}}
-struct __is_member_object_pointer {};  // expected-warning {{made available}}
-struct __is_member_pointer {};  // expected-warning {{made available}}
-struct __is_nothrow_assignable {};  // expected-warning {{made available}}
-struct __is_nothrow_constructible {};  // expected-warning {{made available}}
-struct __is_nothrow_destructible {};  // expected-warning {{made available}}
-struct __is_object {};  // expected-warning {{made available}}
-struct __is_pointer {};  // expected-warning {{made available}}
-struct __is_polymorphic {};  // expected-warning {{made available}}
-struct __is_reference {};  // expected-warning {{made available}}
-struct __is_rvalue_expr {};  // expected-warning {{made available}}
-struct __is_rvalue_reference {};  // expected-warning {{made available}}
-struct __is_same {};  // expected-warning {{made available}}
-struct __is_scalar {};  // expected-warning {{made available}}
-struct __is_sealed {};  // expected-warning {{made available}}
-struct __is_signed {};  // expected-warning {{made available}}
-struct __is_standard_layout {};  // expected-warning {{made available}}
-struct __is_trivial {};  // expected-warning {{made available}}
-struct __is_trivially_assignable {};  // expected-warning {{made available}}
-struct __is_trivially_constructible {};  // expected-warning {{made available}}
-struct __is_trivially_copyable {};  // expected-warning {{made available}}
-struct __is_union {};  // expected-warning {{made available}}
-struct __is_unsigned {};  // expected-warning {{made available}}
-struct __is_void {};  // expected-warning {{made available}}
-struct __is_volatile {};  // expected-warning {{made available}}
-
-
-}
+// Header for PCH test cxx-traits.cpp
+
+namespace n {
+
+template<typename _Tp>
+struct __is_pod { // expected-warning {{keyword '__is_pod' will be made available as an identifier for the remainder of the translation unit}}
+  enum { __value };
+};
+
+template<typename _Tp>
+struct __is_empty { // expected-warning {{keyword '__is_empty' will be made available as an identifier for the remainder of the translation unit}}
+  enum { __value };
+};
+
+template<typename T, typename ...Args>
+struct is_trivially_constructible {
+  static const bool value = __is_trivially_constructible(T, Args...);
+};
+
+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}}
+struct __is_compound {};  // expected-warning {{made available}}
+struct __is_const {};  // expected-warning {{made available}}
+struct __is_constructible {};  // expected-warning {{made available}}
+struct __is_convertible {};  // expected-warning {{made available}}
+struct __is_convertible_to {};  // expected-warning {{made available}}
+struct __is_destructible {};  // expected-warning {{made available}}
+struct __is_enum {};  // expected-warning {{made available}}
+struct __is_floating_point {};  // expected-warning {{made available}}
+struct __is_final {};  // expected-warning {{made available}}
+struct __is_function {};  // expected-warning {{made available}}
+struct __is_fundamental {};  // expected-warning {{made available}}
+struct __is_integral {};  // expected-warning {{made available}}
+struct __is_interface_class {};  // expected-warning {{made available}}
+struct __is_literal {};  // expected-warning {{made available}}
+struct __is_lvalue_expr {};  // expected-warning {{made available}}
+struct __is_lvalue_reference {};  // expected-warning {{made available}}
+struct __is_member_function_pointer {};  // expected-warning {{made available}}
+struct __is_member_object_pointer {};  // expected-warning {{made available}}
+struct __is_member_pointer {};  // expected-warning {{made available}}
+struct __is_nothrow_assignable {};  // expected-warning {{made available}}
+struct __is_nothrow_constructible {};  // expected-warning {{made available}}
+struct __is_nothrow_destructible {};  // expected-warning {{made available}}
+struct __is_object {};  // expected-warning {{made available}}
+struct __is_pointer {};  // expected-warning {{made available}}
+struct __is_polymorphic {};  // expected-warning {{made available}}
+struct __is_reference {};  // expected-warning {{made available}}
+struct __is_rvalue_expr {};  // expected-warning {{made available}}
+struct __is_rvalue_reference {};  // expected-warning {{made available}}
+struct __is_same {};  // expected-warning {{made available}}
+struct __is_scalar {};  // expected-warning {{made available}}
+struct __is_sealed {};  // expected-warning {{made available}}
+struct __is_signed {};  // expected-warning {{made available}}
+struct __is_standard_layout {};  // expected-warning {{made available}}
+struct __is_trivial {};  // expected-warning {{made available}}
+struct __is_trivially_assignable {};  // expected-warning {{made available}}
+struct __is_trivially_constructible {};  // expected-warning {{made available}}
+struct __is_trivially_copyable {};  // expected-warning {{made available}}
+struct __is_union {};  // expected-warning {{made available}}
+struct __is_unsigned {};  // expected-warning {{made available}}
+struct __is_void {};  // expected-warning {{made available}}
+struct __is_volatile {};  // expected-warning {{made available}}
+
+
+}
Index: test/PCH/cxx-traits.cpp
===================================================================
--- test/PCH/cxx-traits.cpp
+++ test/PCH/cxx-traits.cpp
@@ -1,66 +1,67 @@
-// Test this without pch.
-// RUN: %clang_cc1 -fms-extensions -include %S/cxx-traits.h -std=c++11 -fsyntax-only -verify %s
-
-// RUN: %clang_cc1 -fms-extensions -x c++-header -std=c++11 -emit-pch -o %t %S/cxx-traits.h
-// RUN: %clang_cc1 -fms-extensions -std=c++11 -include-pch %t -DPCH -fsyntax-only -verify %s
-
-#ifdef PCH
-// expected-no-diagnostics
-#endif
-
-bool _Is_pod_comparator = n::__is_pod<int>::__value;
-bool _Is_empty_check = n::__is_empty<int>::__value;
-
-bool default_construct_int = n::is_trivially_constructible<int>::value;
-bool copy_construct_int = n::is_trivially_constructible<int, const int&>::value;
-
-// The built-ins should still work too:
-bool _is_abstract_result = __is_abstract(int);
-bool _is_arithmetic_result = __is_arithmetic(int);
-bool _is_array_result = __is_array(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);
-bool _is_compound_result = __is_compound(int);
-bool _is_const_result = __is_const(int);
-bool _is_constructible_result = __is_constructible(int);
-bool _is_convertible_result = __is_convertible(int, int);
-bool _is_convertible_to_result = __is_convertible_to(int, int);
-bool _is_destructible_result = __is_destructible(int);
-bool _is_empty_result = __is_empty(int);
-bool _is_enum_result = __is_enum(int);
-bool _is_floating_point_result = __is_floating_point(int);
-bool _is_final_result = __is_final(int);
-bool _is_function_result = __is_function(int);
-bool _is_fundamental_result = __is_fundamental(int);
-bool _is_integral_result = __is_integral(int);
-bool _is_interface_class_result = __is_interface_class(int);
-bool _is_literal_result = __is_literal(int);
-bool _is_lvalue_expr_result = __is_lvalue_expr(0);
-bool _is_lvalue_reference_result = __is_lvalue_reference(int);
-bool _is_member_function_pointer_result = __is_member_function_pointer(int);
-bool _is_member_object_pointer_result = __is_member_object_pointer(int);
-bool _is_member_pointer_result = __is_member_pointer(int);
-bool _is_nothrow_assignable_result = __is_nothrow_assignable(int, int);
-bool _is_nothrow_constructible_result = __is_nothrow_constructible(int);
-bool _is_nothrow_destructible_result = __is_nothrow_destructible(int);
-bool _is_object_result = __is_object(int);
-bool _is_pod_result = __is_pod(int);
-bool _is_pointer_result = __is_pointer(int);
-bool _is_polymorphic_result = __is_polymorphic(int);
-bool _is_reference_result = __is_reference(int);
-bool _is_rvalue_expr_result = __is_rvalue_expr(0);
-bool _is_rvalue_reference_result = __is_rvalue_reference(int);
-bool _is_same_result = __is_same(int, int);
-bool _is_scalar_result = __is_scalar(int);
-bool _is_sealed_result = __is_sealed(int);
-bool _is_signed_result = __is_signed(int);
-bool _is_standard_layout_result = __is_standard_layout(int);
-bool _is_trivial_result = __is_trivial(int);
-bool _is_trivially_assignable_result = __is_trivially_assignable(int, int);
-bool _is_trivially_constructible_result = __is_trivially_constructible(int);
-bool _is_trivially_copyable_result = __is_trivially_copyable(int);
-bool _is_union_result = __is_union(int);
-bool _is_unsigned_result = __is_unsigned(int);
-bool _is_void_result = __is_void(int);
-bool _is_volatile_result = __is_volatile(int);
+// Test this without pch.
+// RUN: %clang_cc1 -fms-extensions -include %S/cxx-traits.h -std=c++11 -fsyntax-only -verify %s
+
+// RUN: %clang_cc1 -fms-extensions -x c++-header -std=c++11 -emit-pch -o %t %S/cxx-traits.h
+// RUN: %clang_cc1 -fms-extensions -std=c++11 -include-pch %t -DPCH -fsyntax-only -verify %s
+
+#ifdef PCH
+// expected-no-diagnostics
+#endif
+
+bool _Is_pod_comparator = n::__is_pod<int>::__value;
+bool _Is_empty_check = n::__is_empty<int>::__value;
+
+bool default_construct_int = n::is_trivially_constructible<int>::value;
+bool copy_construct_int = n::is_trivially_constructible<int, const int&>::value;
+
+// The built-ins should still work too:
+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);
+bool _is_compound_result = __is_compound(int);
+bool _is_const_result = __is_const(int);
+bool _is_constructible_result = __is_constructible(int);
+bool _is_convertible_result = __is_convertible(int, int);
+bool _is_convertible_to_result = __is_convertible_to(int, int);
+bool _is_destructible_result = __is_destructible(int);
+bool _is_empty_result = __is_empty(int);
+bool _is_enum_result = __is_enum(int);
+bool _is_floating_point_result = __is_floating_point(int);
+bool _is_final_result = __is_final(int);
+bool _is_function_result = __is_function(int);
+bool _is_fundamental_result = __is_fundamental(int);
+bool _is_integral_result = __is_integral(int);
+bool _is_interface_class_result = __is_interface_class(int);
+bool _is_literal_result = __is_literal(int);
+bool _is_lvalue_expr_result = __is_lvalue_expr(0);
+bool _is_lvalue_reference_result = __is_lvalue_reference(int);
+bool _is_member_function_pointer_result = __is_member_function_pointer(int);
+bool _is_member_object_pointer_result = __is_member_object_pointer(int);
+bool _is_member_pointer_result = __is_member_pointer(int);
+bool _is_nothrow_assignable_result = __is_nothrow_assignable(int, int);
+bool _is_nothrow_constructible_result = __is_nothrow_constructible(int);
+bool _is_nothrow_destructible_result = __is_nothrow_destructible(int);
+bool _is_object_result = __is_object(int);
+bool _is_pod_result = __is_pod(int);
+bool _is_pointer_result = __is_pointer(int);
+bool _is_polymorphic_result = __is_polymorphic(int);
+bool _is_reference_result = __is_reference(int);
+bool _is_rvalue_expr_result = __is_rvalue_expr(0);
+bool _is_rvalue_reference_result = __is_rvalue_reference(int);
+bool _is_same_result = __is_same(int, int);
+bool _is_scalar_result = __is_scalar(int);
+bool _is_sealed_result = __is_sealed(int);
+bool _is_signed_result = __is_signed(int);
+bool _is_standard_layout_result = __is_standard_layout(int);
+bool _is_trivial_result = __is_trivial(int);
+bool _is_trivially_assignable_result = __is_trivially_assignable(int, int);
+bool _is_trivially_constructible_result = __is_trivially_constructible(int);
+bool _is_trivially_copyable_result = __is_trivially_copyable(int);
+bool _is_union_result = __is_union(int);
+bool _is_unsigned_result = __is_unsigned(int);
+bool _is_void_result = __is_void(int);
+bool _is_volatile_result = __is_volatile(int);
Index: lib/Sema/SemaExprCXX.cpp
===================================================================
--- lib/Sema/SemaExprCXX.cpp
+++ lib/Sema/SemaExprCXX.cpp
@@ -3722,8 +3722,8 @@
           Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr);
     return true;
 
-  // C++0x [meta.unary.prop] Table 49 requires the following traits to be
-  // applied to a complete type.
+    // C++0x [meta.unary.prop] Table 49 requires the following traits to be
+    // applied to a complete type.
   case UTT_IsTrivial:
   case UTT_IsTriviallyCopyable:
   case UTT_IsStandardLayout:
@@ -4459,6 +4459,7 @@
     return !Result.isInvalid() && !SFINAE.hasErrorOccurred();
   }
 
+  case BTT_IsAssignable:
   case BTT_IsNothrowAssignable:
   case BTT_IsTriviallyAssignable: {
     // C++11 [meta.unary.prop]p3:
@@ -4506,6 +4507,9 @@
     if (Result.isInvalid() || SFINAE.hasErrorOccurred())
       return false;
 
+    if (BTT == BTT_IsAssignable)
+      return true;
+
     if (BTT == BTT_IsNothrowAssignable)
       return Self.canThrow(Result.get()) == CT_Cannot;
 
Index: lib/Parse/ParseExpr.cpp
===================================================================
--- lib/Parse/ParseExpr.cpp
+++ lib/Parse/ParseExpr.cpp
@@ -796,6 +796,7 @@
           REVERTIBLE_TYPE_TRAIT(__is_abstract);
           REVERTIBLE_TYPE_TRAIT(__is_arithmetic);
           REVERTIBLE_TYPE_TRAIT(__is_array);
+          REVERTIBLE_TYPE_TRAIT(__is_assignable);
           REVERTIBLE_TYPE_TRAIT(__is_base_of);
           REVERTIBLE_TYPE_TRAIT(__is_class);
           REVERTIBLE_TYPE_TRAIT(__is_complete_type);
@@ -1369,7 +1370,7 @@
         Diag(PostfixExpr->getExprLoc(),
              diag::err_opencl_taking_function_address_parser);
         return ExprError();
-      }
+}
     }
 
   return Res;
@@ -1476,8 +1477,8 @@
           LHS = Actions.ActOnOMPArraySectionExpr(LHS.get(), Loc, Idx.get(),
                                                  ColonLoc, Length.get(), RLoc);
         } else {
-          LHS = Actions.ActOnArraySubscriptExpr(getCurScope(), LHS.get(), Loc,
-                                                Idx.get(), RLoc);
+        LHS = Actions.ActOnArraySubscriptExpr(getCurScope(), LHS.get(), Loc,
+                                              Idx.get(), RLoc);
         }
       } else {
         LHS = ExprError();
Index: lib/Parse/ParseDeclCXX.cpp
===================================================================
--- lib/Parse/ParseDeclCXX.cpp
+++ lib/Parse/ParseDeclCXX.cpp
@@ -56,8 +56,8 @@
 ///         'namespace' identifier '=' qualified-namespace-specifier ';'
 ///
 Parser::DeclGroupPtrTy Parser::ParseNamespace(unsigned Context,
-                                              SourceLocation &DeclEnd,
-                                              SourceLocation InlineLoc) {
+                             SourceLocation &DeclEnd,
+                             SourceLocation InlineLoc) {
   assert(Tok.is(tok::kw_namespace) && "Not a namespace!");
   SourceLocation NamespaceLoc = ConsumeToken();  // eat the 'namespace'.
   ObjCDeclContextSwitch ObjCDC(*this);
@@ -118,7 +118,7 @@
           << FixItHint::CreateRemoval(InlineLoc);
     Decl *NSAlias = ParseNamespaceAlias(NamespaceLoc, IdentLoc, Ident, DeclEnd);
     return Actions.ConvertDeclToDeclGroup(NSAlias);
-}
+  }
 
   BalancedDelimiterTracker T(*this, tok::l_brace);
   if (T.consumeOpen()) {
@@ -200,7 +200,7 @@
 
   DeclEnd = T.getCloseLocation();
   Actions.ActOnFinishNamespaceDef(NamespcDecl, DeclEnd);
-  
+
   return Actions.ConvertDeclToDeclGroup(NamespcDecl, 
                                         ImplicitUsingDirectiveDecl);
 }
@@ -1269,6 +1269,7 @@
       Tok.isOneOf(tok::kw___is_abstract,
                   tok::kw___is_arithmetic,
                   tok::kw___is_array,
+                  tok::kw___is_assignable,
                   tok::kw___is_base_of,
                   tok::kw___is_class,
                   tok::kw___is_complete_type,
@@ -2249,7 +2250,7 @@
 ///
 Parser::DeclGroupPtrTy
 Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
-                                       AttributeList *AccessAttrs,
+                                            AttributeList *AccessAttrs,
                                        const ParsedTemplateInfo &TemplateInfo,
                                        ParsingDeclRAIIObject *TemplateDiags) {
   if (Tok.is(tok::at)) {
@@ -2316,7 +2317,7 @@
       return DeclGroupPtrTy::make(DeclGroupRef(Actions.ActOnUsingDeclaration(
           getCurScope(), AS,
           /* HasUsingKeyword */ false, SourceLocation(), SS, Name,
-          /* AttrList */ nullptr,
+                                    /* AttrList */ nullptr,
           /* HasTypenameKeyword */ false, SourceLocation())));
     }
   }
@@ -2370,8 +2371,8 @@
       SkipUntil(tok::semi, StopBeforeMatch);
       return nullptr;
     }
-    SourceLocation DeclEnd;
-    // Otherwise, it must be a using-declaration or an alias-declaration.
+      SourceLocation DeclEnd;
+      // Otherwise, it must be a using-declaration or an alias-declaration.
     return DeclGroupPtrTy::make(DeclGroupRef(ParseUsingDeclaration(
         Declarator::MemberContext, TemplateInfo, UsingLoc, DeclEnd, AS)));
   }
@@ -3092,7 +3093,7 @@
       // Each iteration of this loop reads one member-declaration.
       ParseCXXClassMemberDeclarationWithPragmas(
           CurAS, AccessAttrs, static_cast<DeclSpec::TST>(TagType), TagDecl);
-    }
+      }
     T.consumeClose();
   } else {
     SkipUntil(tok::r_brace);
Index: include/clang/Basic/TypeTraits.h
===================================================================
--- include/clang/Basic/TypeTraits.h
+++ include/clang/Basic/TypeTraits.h
@@ -1,100 +1,101 @@
-//===--- TypeTraits.h - C++ Type Traits Support Enumerations ----*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief Defines enumerations for the type traits support.
-///
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_BASIC_TYPETRAITS_H
-#define LLVM_CLANG_BASIC_TYPETRAITS_H
-
-namespace clang {
-
-  /// \brief Names for traits that operate specifically on types.
-  enum TypeTrait {
-    UTT_HasNothrowAssign,
-    UTT_HasNothrowMoveAssign,
-    UTT_HasNothrowCopy,
-    UTT_HasNothrowConstructor,
-    UTT_HasTrivialAssign,
-    UTT_HasTrivialMoveAssign,
-    UTT_HasTrivialCopy,
-    UTT_HasTrivialDefaultConstructor,
-    UTT_HasTrivialMoveConstructor,
-    UTT_HasTrivialDestructor,
-    UTT_HasVirtualDestructor,
-    UTT_IsAbstract,
-    UTT_IsArithmetic,
-    UTT_IsArray,
-    UTT_IsClass,
-    UTT_IsCompleteType,
-    UTT_IsCompound,
-    UTT_IsConst,
-    UTT_IsDestructible,
-    UTT_IsEmpty,
-    UTT_IsEnum,
-    UTT_IsFinal,
-    UTT_IsFloatingPoint,
-    UTT_IsFunction,
-    UTT_IsFundamental,
-    UTT_IsIntegral,
-    UTT_IsInterfaceClass,
-    UTT_IsLiteral,
-    UTT_IsLvalueReference,
-    UTT_IsMemberFunctionPointer,
-    UTT_IsMemberObjectPointer,
-    UTT_IsMemberPointer,
-    UTT_IsNothrowDestructible,
-    UTT_IsObject,
-    UTT_IsPOD,
-    UTT_IsPointer,
-    UTT_IsPolymorphic,
-    UTT_IsReference,
-    UTT_IsRvalueReference,
-    UTT_IsScalar,
-    UTT_IsSealed,
-    UTT_IsSigned,
-    UTT_IsStandardLayout,
-    UTT_IsTrivial,
-    UTT_IsTriviallyCopyable,
-    UTT_IsUnion,
-    UTT_IsUnsigned,
-    UTT_IsVoid,
-    UTT_IsVolatile,
-    UTT_Last = UTT_IsVolatile,
-    BTT_IsBaseOf,
-    BTT_IsConvertible,
-    BTT_IsConvertibleTo,
-    BTT_IsSame,
-    BTT_TypeCompatible,
-    BTT_IsNothrowAssignable,
-    BTT_IsTriviallyAssignable,
-    BTT_Last = BTT_IsTriviallyAssignable,
-    TT_IsConstructible,
-    TT_IsNothrowConstructible,
-    TT_IsTriviallyConstructible
-  };
-
-  /// \brief Names for the array type traits.
-  enum ArrayTypeTrait {
-    ATT_ArrayRank,
-    ATT_ArrayExtent
-  };
-
-  /// \brief Names for the "expression or type" traits.
-  enum UnaryExprOrTypeTrait {
-    UETT_SizeOf,
-    UETT_AlignOf,
-    UETT_VecStep,
-    UETT_OpenMPRequiredSimdAlign,
-  };
-}
-
-#endif
+//===--- TypeTraits.h - C++ Type Traits Support Enumerations ----*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief Defines enumerations for the type traits support.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_BASIC_TYPETRAITS_H
+#define LLVM_CLANG_BASIC_TYPETRAITS_H
+
+namespace clang {
+
+  /// \brief Names for traits that operate specifically on types.
+  enum TypeTrait {
+    UTT_HasNothrowAssign,
+    UTT_HasNothrowMoveAssign,
+    UTT_HasNothrowCopy,
+    UTT_HasNothrowConstructor,
+    UTT_HasTrivialAssign,
+    UTT_HasTrivialMoveAssign,
+    UTT_HasTrivialCopy,
+    UTT_HasTrivialDefaultConstructor,
+    UTT_HasTrivialMoveConstructor,
+    UTT_HasTrivialDestructor,
+    UTT_HasVirtualDestructor,
+    UTT_IsAbstract,
+    UTT_IsArithmetic,
+    UTT_IsArray,
+    UTT_IsClass,
+    UTT_IsCompleteType,
+    UTT_IsCompound,
+    UTT_IsConst,
+    UTT_IsDestructible,
+    UTT_IsEmpty,
+    UTT_IsEnum,
+    UTT_IsFinal,
+    UTT_IsFloatingPoint,
+    UTT_IsFunction,
+    UTT_IsFundamental,
+    UTT_IsIntegral,
+    UTT_IsInterfaceClass,
+    UTT_IsLiteral,
+    UTT_IsLvalueReference,
+    UTT_IsMemberFunctionPointer,
+    UTT_IsMemberObjectPointer,
+    UTT_IsMemberPointer,
+    UTT_IsNothrowDestructible,
+    UTT_IsObject,
+    UTT_IsPOD,
+    UTT_IsPointer,
+    UTT_IsPolymorphic,
+    UTT_IsReference,
+    UTT_IsRvalueReference,
+    UTT_IsScalar,
+    UTT_IsSealed,
+    UTT_IsSigned,
+    UTT_IsStandardLayout,
+    UTT_IsTrivial,
+    UTT_IsTriviallyCopyable,
+    UTT_IsUnion,
+    UTT_IsUnsigned,
+    UTT_IsVoid,
+    UTT_IsVolatile,
+    UTT_Last = UTT_IsVolatile,
+    BTT_IsBaseOf,
+    BTT_IsConvertible,
+    BTT_IsConvertibleTo,
+    BTT_IsSame,
+    BTT_TypeCompatible,
+    BTT_IsAssignable,
+    BTT_IsNothrowAssignable,
+    BTT_IsTriviallyAssignable,
+    BTT_Last = BTT_IsTriviallyAssignable,
+    TT_IsConstructible,
+    TT_IsNothrowConstructible,
+    TT_IsTriviallyConstructible
+  };
+
+  /// \brief Names for the array type traits.
+  enum ArrayTypeTrait {
+    ATT_ArrayRank,
+    ATT_ArrayExtent
+  };
+
+  /// \brief Names for the "expression or type" traits.
+  enum UnaryExprOrTypeTrait {
+    UETT_SizeOf,
+    UETT_AlignOf,
+    UETT_VecStep,
+    UETT_OpenMPRequiredSimdAlign,
+  };
+}
+
+#endif
Index: include/clang/Basic/TokenKinds.def
===================================================================
--- include/clang/Basic/TokenKinds.def
+++ include/clang/Basic/TokenKinds.def
@@ -407,6 +407,9 @@
 TYPE_TRAIT_N(__is_constructible, IsConstructible, KEYCXX)
 TYPE_TRAIT_N(__is_nothrow_constructible, IsNothrowConstructible, KEYCXX)
 
+// MSVC14.0 / VS2015 Type Traits
+TYPE_TRAIT_2(__is_assignable, IsAssignable, KEYCXX)
+
 // GNU and MS Type Traits
 TYPE_TRAIT_1(__has_nothrow_assign, HasNothrowAssign, KEYCXX)
 TYPE_TRAIT_1(__has_nothrow_move_assign, HasNothrowMoveAssign, KEYCXX)
Index: docs/LanguageExtensions.rst
===================================================================
--- docs/LanguageExtensions.rst
+++ docs/LanguageExtensions.rst
@@ -1022,6 +1022,7 @@
 * ``__is_nothrow_assignable`` (MSVC 2013, clang)
 * ``__is_constructible`` (MSVC 2013, clang)
 * ``__is_nothrow_constructible`` (MSVC 2013, clang)
+* ``__is_assignable`` (MSVC 2015, clang)
 
 Blocks
 ======
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to