[cfe-commits] r151352 - in /cfe/trunk: docs/ include/clang/AST/ include/clang/Basic/ include/clang/Parse/ include/clang/Sema/ include/clang/Serialization/ lib/AST/ lib/Lex/ lib/Parse/ lib/Sema/ lib/Serialization/ lib/StaticAnalyzer/Core/ test/Index/ test/PCH/ test/SemaCXX/ tools/libclang/
Howard Hinnant
hhinnant at apple.com
Fri Feb 24 06:09:53 PST 2012
Awesome, thanks!
Howard
On Feb 24, 2012, at 2:38 AM, Douglas Gregor wrote:
> Author: dgregor
> Date: Fri Feb 24 01:38:34 2012
> New Revision: 151352
>
> URL: http://llvm.org/viewvc/llvm-project?rev=151352&view=rev
> Log:
> Implement a new type trait __is_trivially_constructible(T, Args...)
> that provides the behavior of the C++11 library trait
> std::is_trivially_constructible<T, Args...>, which can't be
> implemented purely as a library.
>
> Since __is_trivially_constructible can have zero or more arguments, I
> needed to add Yet Another Type Trait Expression Class, this one
> handling arbitrary arguments. The next step will be to migrate
> UnaryTypeTrait and BinaryTypeTrait over to this new, more general
> TypeTrait class.
>
> Fixes the Clang side of <rdar://problem/10895483> / PR12038.
>
> Modified:
> cfe/trunk/docs/LanguageExtensions.html
> cfe/trunk/include/clang/AST/ExprCXX.h
> cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
> cfe/trunk/include/clang/AST/Stmt.h
> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> cfe/trunk/include/clang/Basic/StmtNodes.td
> cfe/trunk/include/clang/Basic/TokenKinds.def
> cfe/trunk/include/clang/Basic/TypeTraits.h
> cfe/trunk/include/clang/Parse/Parser.h
> cfe/trunk/include/clang/Sema/Sema.h
> cfe/trunk/include/clang/Serialization/ASTBitCodes.h
> cfe/trunk/lib/AST/Expr.cpp
> cfe/trunk/lib/AST/ExprCXX.cpp
> cfe/trunk/lib/AST/ExprClassification.cpp
> cfe/trunk/lib/AST/ExprConstant.cpp
> cfe/trunk/lib/AST/ItaniumMangle.cpp
> cfe/trunk/lib/AST/StmtPrinter.cpp
> cfe/trunk/lib/AST/StmtProfile.cpp
> cfe/trunk/lib/Lex/PPMacroExpansion.cpp
> cfe/trunk/lib/Parse/ParseExpr.cpp
> cfe/trunk/lib/Parse/ParseExprCXX.cpp
> cfe/trunk/lib/Parse/ParseTentative.cpp
> cfe/trunk/lib/Sema/SemaExprCXX.cpp
> cfe/trunk/lib/Sema/TreeTransform.h
> cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
> cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
> cfe/trunk/test/Index/annotate-tokens-cxx0x.cpp
> cfe/trunk/test/PCH/cxx-traits.cpp
> cfe/trunk/test/PCH/cxx-traits.h
> cfe/trunk/test/SemaCXX/type-traits.cpp
> cfe/trunk/tools/libclang/CIndex.cpp
> cfe/trunk/tools/libclang/CXCursor.cpp
>
> Modified: cfe/trunk/docs/LanguageExtensions.html
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LanguageExtensions.html?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/docs/LanguageExtensions.html (original)
> +++ cfe/trunk/docs/LanguageExtensions.html Fri Feb 24 01:38:34 2012
> @@ -889,6 +889,8 @@
> <li><code>__is_literal(type)</code>: Determines whether the given type is a literal type</li>
> <li><code>__is_final</code>: Determines whether the given type is declared with a <code>final</code> class-virt-specifier.</li>
> <li><code>__underlying_type(type)</code>: Retrieves the underlying type for a given <code>enum</code> type. This trait is required to implement the C++11 standard library.</li>
> + <li><code>__is_trivially_assignable(totype, fromtype)</code>: Determines whether a value of type <tt>totype</tt> can be assigned to from a value of type <tt>fromtype</tt> such that no non-trivial functions are called as part of that assignment. This trait is required to implement the C++11 standard library.</li>
> + <li><code>__is_trivially_constructible(type, argtypes...)</code>: Determines whether a value of type <tt>type</tt> can be direct-initialized with arguments of types <tt>argtypes...</tt> such that no non-trivial functions are called as part of that initialization. This trait is required to implement the C++11 standard library.</li>
> </ul>
>
> <!-- ======================================================================= -->
>
> Modified: cfe/trunk/include/clang/AST/ExprCXX.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/ExprCXX.h (original)
> +++ cfe/trunk/include/clang/AST/ExprCXX.h Fri Feb 24 01:38:34 2012
> @@ -1926,6 +1926,102 @@
> friend class ASTStmtReader;
> };
>
> +/// \brief A type trait used in the implementation of various C++11 and
> +/// Library TR1 trait templates.
> +///
> +/// \code
> +/// __is_trivially_constructible(vector<int>, int*, int*)
> +/// \endcode
> +class TypeTraitExpr : public Expr {
> + /// \brief The location of the type trait keyword.
> + SourceLocation Loc;
> +
> + /// \brief The location of the closing parenthesis.
> + SourceLocation RParenLoc;
> +
> + // Note: The TypeSourceInfos for the arguments are allocated after the
> + // TypeTraitExpr.
> +
> + TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind,
> + ArrayRef<TypeSourceInfo *> Args,
> + SourceLocation RParenLoc,
> + bool Value);
> +
> + TypeTraitExpr(EmptyShell Empty) : Expr(TypeTraitExprClass, Empty) { }
> +
> + /// \brief Retrieve the argument types.
> + TypeSourceInfo **getTypeSourceInfos() {
> + return reinterpret_cast<TypeSourceInfo **>(this+1);
> + }
> +
> + /// \brief Retrieve the argument types.
> + TypeSourceInfo * const *getTypeSourceInfos() const {
> + return reinterpret_cast<TypeSourceInfo * const*>(this+1);
> + }
> +
> +public:
> + /// \brief Create a new type trait expression.
> + static TypeTraitExpr *Create(ASTContext &C, QualType T, SourceLocation Loc,
> + TypeTrait Kind,
> + ArrayRef<TypeSourceInfo *> Args,
> + SourceLocation RParenLoc,
> + bool Value);
> +
> + static TypeTraitExpr *CreateDeserialized(ASTContext &C, unsigned NumArgs);
> +
> + /// \brief Determine which type trait this expression uses.
> + TypeTrait getTrait() const {
> + return static_cast<TypeTrait>(TypeTraitExprBits.Kind);
> + }
> +
> + bool getValue() const {
> + assert(!isValueDependent());
> + return TypeTraitExprBits.Value;
> + }
> +
> + /// \brief Determine the number of arguments to this type trait.
> + unsigned getNumArgs() const { return TypeTraitExprBits.NumArgs; }
> +
> + /// \brief Retrieve the Ith argument.
> + TypeSourceInfo *getArg(unsigned I) const {
> + assert(I < getNumArgs() && "Argument out-of-range");
> + return getArgs()[I];
> + }
> +
> + /// \brief Retrieve the argument types.
> + ArrayRef<TypeSourceInfo *> getArgs() const {
> + return ArrayRef<TypeSourceInfo *>(getTypeSourceInfos(), getNumArgs());
> + }
> +
> + typedef TypeSourceInfo **arg_iterator;
> + arg_iterator arg_begin() {
> + return getTypeSourceInfos();
> + }
> + arg_iterator arg_end() {
> + return getTypeSourceInfos() + getNumArgs();
> + }
> +
> + typedef TypeSourceInfo const * const *arg_const_iterator;
> + arg_const_iterator arg_begin() const { return getTypeSourceInfos(); }
> + arg_const_iterator arg_end() const {
> + return getTypeSourceInfos() + getNumArgs();
> + }
> +
> + SourceRange getSourceRange() const { return SourceRange(Loc, RParenLoc); }
> +
> + static bool classof(const Stmt *T) {
> + return T->getStmtClass() == TypeTraitExprClass;
> + }
> + static bool classof(const TypeTraitExpr *) { return true; }
> +
> + // Iterators
> + child_range children() { return child_range(); }
> +
> + friend class ASTStmtReader;
> + friend class ASTStmtWriter;
> +
> +};
> +
> /// ArrayTypeTraitExpr - An Embarcadero array type trait, as used in the
> /// implementation of __array_rank and __array_extent.
> /// Example:
>
> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Fri Feb 24 01:38:34 2012
> @@ -1946,6 +1946,11 @@
> TRY_TO(TraverseTypeLoc(S->getRhsTypeSourceInfo()->getTypeLoc()));
> })
>
> +DEF_TRAVERSE_STMT(TypeTraitExpr, {
> + for (unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
> + TRY_TO(TraverseTypeLoc(S->getArg(I)->getTypeLoc()));
> +})
> +
> DEF_TRAVERSE_STMT(ArrayTypeTraitExpr, {
> TRY_TO(TraverseTypeLoc(S->getQueriedTypeSourceInfo()->getTypeLoc()));
> })
>
> Modified: cfe/trunk/include/clang/AST/Stmt.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Stmt.h?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Stmt.h (original)
> +++ cfe/trunk/include/clang/AST/Stmt.h Fri Feb 24 01:38:34 2012
> @@ -227,6 +227,24 @@
> unsigned InitializesStdInitializerList : 1;
> };
>
> + class TypeTraitExprBitfields {
> + friend class TypeTraitExpr;
> + friend class ASTStmtReader;
> + friend class ASTStmtWriter;
> +
> + unsigned : NumExprBits;
> +
> + /// \brief The kind of type trait, which is a value of a TypeTrait enumerator.
> + unsigned Kind : 8;
> +
> + /// \brief If this expression is not value-dependent, this indicates whether
> + /// the trait evaluated true or false.
> + unsigned Value : 1;
> +
> + /// \brief The number of arguments to this type trait.
> + unsigned NumArgs : 32 - 8 - 1 - NumExprBits;
> + };
> +
> union {
> // FIXME: this is wasteful on 64-bit platforms.
> void *Aligner;
> @@ -241,9 +259,11 @@
> PseudoObjectExprBitfields PseudoObjectExprBits;
> ObjCIndirectCopyRestoreExprBitfields ObjCIndirectCopyRestoreExprBits;
> InitListExprBitfields InitListExprBits;
> + TypeTraitExprBitfields TypeTraitExprBits;
> };
>
> friend class ASTStmtReader;
> + friend class ASTStmtWriter;
>
> public:
> // Only allow allocation of Stmts using the allocator in ASTContext
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Feb 24 01:38:34 2012
> @@ -4438,6 +4438,10 @@
>
> def err_incomplete_type_used_in_type_trait_expr : Error<
> "incomplete type %0 used in type trait expression">;
> +def err_type_trait_arity : Error<
> + "type trait requires %0%select{| or more}1 argument%select{|s}2; have "
> + "%3 argument%s3">;
> +
> def err_dimension_expr_not_constant_integer : Error<
> "dimension expression does not evaluate to a constant unsigned int">;
> def err_expected_ident_or_lparen : Error<"expected identifier or '('">;
>
> Modified: cfe/trunk/include/clang/Basic/StmtNodes.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/StmtNodes.td?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/StmtNodes.td (original)
> +++ cfe/trunk/include/clang/Basic/StmtNodes.td Fri Feb 24 01:38:34 2012
> @@ -107,6 +107,7 @@
> def CXXNewExpr : DStmt<Expr>;
> def CXXDeleteExpr : DStmt<Expr>;
> def CXXPseudoDestructorExpr : DStmt<Expr>;
> +def TypeTraitExpr : DStmt<Expr>;
> def UnaryTypeTraitExpr : DStmt<Expr>;
> def BinaryTypeTraitExpr : DStmt<Expr>;
> def ArrayTypeTraitExpr : DStmt<Expr>;
>
> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TokenKinds.def?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Fri Feb 24 01:38:34 2012
> @@ -365,6 +365,7 @@
> KEYWORD(__is_union , KEYCXX)
>
> // Clang-only C++ Type Traits
> +KEYWORD(__is_trivially_constructible, KEYCXX)
> KEYWORD(__is_trivially_copyable , KEYCXX)
> KEYWORD(__is_trivially_assignable , KEYCXX)
> KEYWORD(__underlying_type , KEYCXX)
>
> Modified: cfe/trunk/include/clang/Basic/TypeTraits.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TypeTraits.h?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/TypeTraits.h (original)
> +++ cfe/trunk/include/clang/Basic/TypeTraits.h Fri Feb 24 01:38:34 2012
> @@ -84,6 +84,12 @@
> UETT_AlignOf,
> UETT_VecStep
> };
> +
> + /// \brief Names for type traits that operate specifically on types.
> + enum TypeTrait {
> + TT_IsTriviallyConstructible
> + };
> +
> }
>
> #endif
>
> Modified: cfe/trunk/include/clang/Parse/Parser.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Parse/Parser.h (original)
> +++ cfe/trunk/include/clang/Parse/Parser.h Fri Feb 24 01:38:34 2012
> @@ -2170,7 +2170,8 @@
> // GNU G++: Type Traits [Type-Traits.html in the GCC manual]
> ExprResult ParseUnaryTypeTrait();
> ExprResult ParseBinaryTypeTrait();
> -
> + ExprResult ParseTypeTrait();
> +
> //===--------------------------------------------------------------------===//
> // Embarcadero: Arary and Expression Traits
> ExprResult ParseArrayTypeTrait();
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Fri Feb 24 01:38:34 2012
> @@ -3317,6 +3317,14 @@
> TypeSourceInfo *RhsT,
> SourceLocation RParen);
>
> + /// \brief Parsed one of the type trait support pseudo-functions.
> + ExprResult ActOnTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
> + ArrayRef<ParsedType> Args,
> + SourceLocation RParenLoc);
> + ExprResult BuildTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
> + ArrayRef<TypeSourceInfo *> Args,
> + SourceLocation RParenLoc);
> +
> /// ActOnArrayTypeTrait - Parsed one of the bianry type trait support
> /// pseudo-functions.
> ExprResult ActOnArrayTypeTrait(ArrayTypeTrait ATT,
>
> Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Fri Feb 24 01:38:34 2012
> @@ -1156,6 +1156,7 @@
> EXPR_OPAQUE_VALUE, // OpaqueValueExpr
> EXPR_BINARY_CONDITIONAL_OPERATOR, // BinaryConditionalOperator
> EXPR_BINARY_TYPE_TRAIT, // BinaryTypeTraitExpr
> + EXPR_TYPE_TRAIT, // TypeTraitExpr
> EXPR_ARRAY_TYPE_TRAIT, // ArrayTypeTraitIntExpr
>
> EXPR_PACK_EXPANSION, // PackExpansionExpr
>
> Modified: cfe/trunk/lib/AST/Expr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/Expr.cpp (original)
> +++ cfe/trunk/lib/AST/Expr.cpp Fri Feb 24 01:38:34 2012
> @@ -2169,6 +2169,7 @@
> case AddrLabelExprClass:
> case ArrayTypeTraitExprClass:
> case BinaryTypeTraitExprClass:
> + case TypeTraitExprClass:
> case CXXBoolLiteralExprClass:
> case CXXNoexceptExprClass:
> case CXXNullPtrLiteralExprClass:
>
> Modified: cfe/trunk/lib/AST/ExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprCXX.cpp (original)
> +++ cfe/trunk/lib/AST/ExprCXX.cpp Fri Feb 24 01:38:34 2012
> @@ -199,7 +199,6 @@
> return SourceRange(Base->getLocStart(), End);
> }
>
> -
> // UnresolvedLookupExpr
> UnresolvedLookupExpr *
> UnresolvedLookupExpr::Create(ASTContext &C,
> @@ -1262,4 +1261,51 @@
> return TemplateArgument(Arguments, NumArguments);
> }
>
> +TypeTraitExpr::TypeTraitExpr(QualType T, SourceLocation Loc, TypeTrait Kind,
> + ArrayRef<TypeSourceInfo *> Args,
> + SourceLocation RParenLoc,
> + bool Value)
> + : Expr(TypeTraitExprClass, T, VK_RValue, OK_Ordinary,
> + /*TypeDependent=*/false,
> + /*ValueDependent=*/false,
> + /*InstantiationDependent=*/false,
> + /*ContainsUnexpandedParameterPack=*/false),
> + Loc(Loc), RParenLoc(RParenLoc)
> +{
> + TypeTraitExprBits.Kind = Kind;
> + TypeTraitExprBits.Value = Value;
> + TypeTraitExprBits.NumArgs = Args.size();
> +
> + TypeSourceInfo **ToArgs = getTypeSourceInfos();
> +
> + for (unsigned I = 0, N = Args.size(); I != N; ++I) {
> + if (Args[I]->getType()->isDependentType())
> + setValueDependent(true);
> + if (Args[I]->getType()->isInstantiationDependentType())
> + setInstantiationDependent(true);
> + if (Args[I]->getType()->containsUnexpandedParameterPack())
> + setContainsUnexpandedParameterPack(true);
> +
> + ToArgs[I] = Args[I];
> + }
> +}
> +
> +TypeTraitExpr *TypeTraitExpr::Create(ASTContext &C, QualType T,
> + SourceLocation Loc,
> + TypeTrait Kind,
> + ArrayRef<TypeSourceInfo *> Args,
> + SourceLocation RParenLoc,
> + bool Value) {
> + unsigned Size = sizeof(TypeTraitExpr) + sizeof(TypeSourceInfo*) * Args.size();
> + void *Mem = C.Allocate(Size);
> + return new (Mem) TypeTraitExpr(T, Loc, Kind, Args, RParenLoc, Value);
> +}
> +
> +TypeTraitExpr *TypeTraitExpr::CreateDeserialized(ASTContext &C,
> + unsigned NumArgs) {
> + unsigned Size = sizeof(TypeTraitExpr) + sizeof(TypeSourceInfo*) * NumArgs;
> + void *Mem = C.Allocate(Size);
> + return new (Mem) TypeTraitExpr(EmptyShell());
> +}
> +
> void ArrayTypeTraitExpr::anchor() { }
>
> Modified: cfe/trunk/lib/AST/ExprClassification.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprClassification.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprClassification.cpp (original)
> +++ cfe/trunk/lib/AST/ExprClassification.cpp Fri Feb 24 01:38:34 2012
> @@ -151,6 +151,7 @@
> case Expr::CXXScalarValueInitExprClass:
> case Expr::UnaryTypeTraitExprClass:
> case Expr::BinaryTypeTraitExprClass:
> + case Expr::TypeTraitExprClass:
> case Expr::ArrayTypeTraitExprClass:
> case Expr::ExpressionTraitExprClass:
> case Expr::ObjCSelectorExprClass:
>
> Modified: cfe/trunk/lib/AST/ExprConstant.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)
> +++ cfe/trunk/lib/AST/ExprConstant.cpp Fri Feb 24 01:38:34 2012
> @@ -4119,6 +4119,10 @@
> return Success(E->getValue(), E);
> }
>
> + bool VisitTypeTraitExpr(const TypeTraitExpr *E) {
> + return Success(E->getValue(), E);
> + }
> +
> bool VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) {
> return Success(E->getValue(), E);
> }
> @@ -6360,6 +6364,7 @@
> case Expr::CXXScalarValueInitExprClass:
> case Expr::UnaryTypeTraitExprClass:
> case Expr::BinaryTypeTraitExprClass:
> + case Expr::TypeTraitExprClass:
> case Expr::ArrayTypeTraitExprClass:
> case Expr::ExpressionTraitExprClass:
> case Expr::CXXNoexceptExprClass:
>
> Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ItaniumMangle.cpp (original)
> +++ cfe/trunk/lib/AST/ItaniumMangle.cpp Fri Feb 24 01:38:34 2012
> @@ -2383,6 +2383,7 @@
> case Expr::StmtExprClass:
> case Expr::UnaryTypeTraitExprClass:
> case Expr::BinaryTypeTraitExprClass:
> + case Expr::TypeTraitExprClass:
> case Expr::ArrayTypeTraitExprClass:
> case Expr::ExpressionTraitExprClass:
> case Expr::VAArgExprClass:
>
> Modified: cfe/trunk/lib/AST/StmtPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/StmtPrinter.cpp (original)
> +++ cfe/trunk/lib/AST/StmtPrinter.cpp Fri Feb 24 01:38:34 2012
> @@ -1555,6 +1555,13 @@
> llvm_unreachable("Binary type trait not covered by switch");
> }
>
> +static const char *getTypeTraitName(TypeTrait TT) {
> + switch (TT) {
> + case clang::TT_IsTriviallyConstructible:return "__is_trivially_constructible";
> + }
> + llvm_unreachable("Type trait not covered by switch");
> +}
> +
> static const char *getTypeTraitName(ArrayTypeTrait ATT) {
> switch (ATT) {
> case ATT_ArrayRank: return "__array_rank";
> @@ -1582,6 +1589,16 @@
> << E->getRhsType().getAsString(Policy) << ")";
> }
>
> +void StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) {
> + OS << getTypeTraitName(E->getTrait()) << "(";
> + for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
> + if (I > 0)
> + OS << ", ";
> + OS << E->getArg(I)->getType().getAsString(Policy);
> + }
> + OS << ")";
> +}
> +
> void StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
> OS << getTypeTraitName(E->getTrait()) << "("
> << E->getQueriedType().getAsString(Policy) << ")";
>
> Modified: cfe/trunk/lib/AST/StmtProfile.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/StmtProfile.cpp (original)
> +++ cfe/trunk/lib/AST/StmtProfile.cpp Fri Feb 24 01:38:34 2012
> @@ -868,6 +868,14 @@
> VisitType(S->getRhsType());
> }
>
> +void StmtProfiler::VisitTypeTraitExpr(const TypeTraitExpr *S) {
> + VisitExpr(S);
> + ID.AddInteger(S->getTrait());
> + ID.AddInteger(S->getNumArgs());
> + for (unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
> + VisitType(S->getArg(I)->getType());
> +}
> +
> void StmtProfiler::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *S) {
> VisitExpr(S);
> ID.AddInteger(S->getTrait());
>
> Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original)
> +++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Fri Feb 24 01:38:34 2012
> @@ -701,6 +701,7 @@
> .Case("is_polymorphic", LangOpts.CPlusPlus)
> .Case("is_trivial", LangOpts.CPlusPlus)
> .Case("is_trivially_assignable", LangOpts.CPlusPlus)
> + .Case("is_trivially_constructible", LangOpts.CPlusPlus)
> .Case("is_trivially_copyable", LangOpts.CPlusPlus)
> .Case("is_union", LangOpts.CPlusPlus)
> .Case("modules", LangOpts.Modules)
>
> Modified: cfe/trunk/lib/Parse/ParseExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseExpr.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseExpr.cpp Fri Feb 24 01:38:34 2012
> @@ -1143,6 +1143,9 @@
> case tok::kw___is_trivially_assignable:
> return ParseBinaryTypeTrait();
>
> + case tok::kw___is_trivially_constructible:
> + return ParseTypeTrait();
> +
> case tok::kw___array_rank:
> case tok::kw___array_extent:
> return ParseArrayTypeTrait();
>
> Modified: cfe/trunk/lib/Parse/ParseExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExprCXX.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseExprCXX.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseExprCXX.cpp Fri Feb 24 01:38:34 2012
> @@ -2458,6 +2458,14 @@
> }
> }
>
> +static TypeTrait TypeTraitFromTokKind(tok::TokenKind kind) {
> + switch (kind) {
> + default: llvm_unreachable("Not a known type trait");
> + case tok::kw___is_trivially_constructible:
> + return TT_IsTriviallyConstructible;
> + }
> +}
> +
> static ArrayTypeTrait ArrayTypeTraitFromTokKind(tok::TokenKind kind) {
> switch(kind) {
> default: llvm_unreachable("Not a known binary type trait");
> @@ -2540,6 +2548,58 @@
> T.getCloseLocation());
> }
>
> +/// \brief Parse the built-in type-trait pseudo-functions that allow
> +/// implementation of the TR1/C++11 type traits templates.
> +///
> +/// primary-expression:
> +/// type-trait '(' type-id-seq ')'
> +///
> +/// type-id-seq:
> +/// type-id ...[opt] type-id-seq[opt]
> +///
> +ExprResult Parser::ParseTypeTrait() {
> + TypeTrait Kind = TypeTraitFromTokKind(Tok.getKind());
> + SourceLocation Loc = ConsumeToken();
> +
> + BalancedDelimiterTracker Parens(*this, tok::l_paren);
> + if (Parens.expectAndConsume(diag::err_expected_lparen))
> + return ExprError();
> +
> + llvm::SmallVector<ParsedType, 2> Args;
> + do {
> + // Parse the next type.
> + TypeResult Ty = ParseTypeName();
> + if (Ty.isInvalid()) {
> + Parens.skipToEnd();
> + return ExprError();
> + }
> +
> + // Parse the ellipsis, if present.
> + if (Tok.is(tok::ellipsis)) {
> + Ty = Actions.ActOnPackExpansion(Ty.get(), ConsumeToken());
> + if (Ty.isInvalid()) {
> + Parens.skipToEnd();
> + return ExprError();
> + }
> + }
> +
> + // Add this type to the list of arguments.
> + Args.push_back(Ty.get());
> +
> + if (Tok.is(tok::comma)) {
> + ConsumeToken();
> + continue;
> + }
> +
> + break;
> + } while (true);
> +
> + if (Parens.consumeClose())
> + return ExprError();
> +
> + return Actions.ActOnTypeTrait(Kind, Loc, Args, Parens.getCloseLocation());
> +}
> +
> /// ParseArrayTypeTrait - Parse the built-in array type-trait
> /// pseudo-functions.
> ///
>
> Modified: cfe/trunk/lib/Parse/ParseTentative.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseTentative.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseTentative.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseTentative.cpp Fri Feb 24 01:38:34 2012
> @@ -690,6 +690,7 @@
> case tok::kw___is_polymorphic:
> case tok::kw___is_trivial:
> case tok::kw___is_trivially_assignable:
> + case tok::kw___is_trivially_constructible:
> case tok::kw___is_trivially_copyable:
> case tok::kw___is_union:
> case tok::kw___uuidof:
>
> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Fri Feb 24 01:38:34 2012
> @@ -3212,6 +3212,127 @@
> return BuildBinaryTypeTrait(BTT, KWLoc, LhsTSInfo, RhsTSInfo, RParen);
> }
>
> +static bool evaluateTypeTrait(Sema &S, TypeTrait Kind, SourceLocation KWLoc,
> + ArrayRef<TypeSourceInfo *> Args,
> + SourceLocation RParenLoc) {
> + switch (Kind) {
> + case clang::TT_IsTriviallyConstructible: {
> + // C++11 [meta.unary.prop]:
> + // is_trivially_constructor is defined as:
> + //
> + // is_constructible<T, Args...>::value is true and the variable
> + //
> + /// definition for is_constructible, as defined below, is known to call no
> + // operation that is not trivial.
> + //
> + // The predicate condition for a template specialization
> + // is_constructible<T, Args...> shall be satisfied if and only if the
> + // following variable definition would be well-formed for some invented
> + // variable t:
> + //
> + // T t(create<Args>()...);
> + if (Args.empty()) {
> + S.Diag(KWLoc, diag::err_type_trait_arity)
> + << 1 << 1 << 1 << (int)Args.size();
> + return false;
> + }
> +
> + bool SawVoid = false;
> + for (unsigned I = 0, N = Args.size(); I != N; ++I) {
> + if (Args[I]->getType()->isVoidType()) {
> + SawVoid = true;
> + continue;
> + }
> +
> + if (!Args[I]->getType()->isIncompleteType() &&
> + S.RequireCompleteType(KWLoc, Args[I]->getType(),
> + diag::err_incomplete_type_used_in_type_trait_expr))
> + return false;
> + }
> +
> + // If any argument was 'void', of course it won't type-check.
> + if (SawVoid)
> + return false;
> +
> + llvm::SmallVector<OpaqueValueExpr, 2> OpaqueArgExprs;
> + llvm::SmallVector<Expr *, 2> ArgExprs;
> + ArgExprs.reserve(Args.size() - 1);
> + for (unsigned I = 1, N = Args.size(); I != N; ++I) {
> + QualType T = Args[I]->getType();
> + if (T->isObjectType() || T->isFunctionType())
> + T = S.Context.getRValueReferenceType(T);
> + OpaqueArgExprs.push_back(
> + OpaqueValueExpr(Args[I]->getTypeLoc().getSourceRange().getBegin(),
> + T.getNonLValueExprType(S.Context),
> + Expr::getValueKindForType(T)));
> + ArgExprs.push_back(&OpaqueArgExprs.back());
> + }
> +
> + // Perform the initialization in an unevaluated context within a SFINAE
> + // trap at translation unit scope.
> + EnterExpressionEvaluationContext Unevaluated(S, Sema::Unevaluated);
> + Sema::SFINAETrap SFINAE(S, /*AccessCheckingSFINAE=*/true);
> + Sema::ContextRAII TUContext(S, S.Context.getTranslationUnitDecl());
> + InitializedEntity To(InitializedEntity::InitializeTemporary(Args[0]));
> + InitializationKind InitKind(InitializationKind::CreateDirect(KWLoc, KWLoc,
> + RParenLoc));
> + InitializationSequence Init(S, To, InitKind,
> + ArgExprs.begin(), ArgExprs.size());
> + if (Init.Failed())
> + return false;
> +
> + ExprResult Result = Init.Perform(S, To, InitKind,
> + MultiExprArg(ArgExprs.data(),
> + ArgExprs.size()));
> + if (Result.isInvalid() || SFINAE.hasErrorOccurred())
> + return false;
> +
> + // The initialization succeeded; not make sure there are no non-trivial
> + // calls.
> + return !Result.get()->hasNonTrivialCall(S.Context);
> + }
> + }
> +
> + return false;
> +}
> +
> +ExprResult Sema::BuildTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
> + ArrayRef<TypeSourceInfo *> Args,
> + SourceLocation RParenLoc) {
> + bool Dependent = false;
> + for (unsigned I = 0, N = Args.size(); I != N; ++I) {
> + if (Args[I]->getType()->isDependentType()) {
> + Dependent = true;
> + break;
> + }
> + }
> +
> + bool Value = false;
> + if (!Dependent)
> + Value = evaluateTypeTrait(*this, Kind, KWLoc, Args, RParenLoc);
> +
> + return TypeTraitExpr::Create(Context, Context.BoolTy, KWLoc, Kind,
> + Args, RParenLoc, Value);
> +}
> +
> +ExprResult Sema::ActOnTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
> + ArrayRef<ParsedType> Args,
> + SourceLocation RParenLoc) {
> + llvm::SmallVector<TypeSourceInfo *, 4> ConvertedArgs;
> + ConvertedArgs.reserve(Args.size());
> +
> + for (unsigned I = 0, N = Args.size(); I != N; ++I) {
> + TypeSourceInfo *TInfo;
> + QualType T = GetTypeFromParser(Args[I], &TInfo);
> + if (!TInfo)
> + TInfo = Context.getTrivialTypeSourceInfo(T, KWLoc);
> +
> + ConvertedArgs.push_back(TInfo);
> + }
> +
> + return BuildTypeTrait(Kind, KWLoc, ConvertedArgs, RParenLoc);
> +}
> +
> static bool EvaluateBinaryTypeTrait(Sema &Self, BinaryTypeTrait BTT,
> QualType LhsT, QualType RhsT,
> SourceLocation KeyLoc) {
>
> Modified: cfe/trunk/lib/Sema/TreeTransform.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
> +++ cfe/trunk/lib/Sema/TreeTransform.h Fri Feb 24 01:38:34 2012
> @@ -2022,6 +2022,17 @@
> return getSema().BuildBinaryTypeTrait(Trait, StartLoc, LhsT, RhsT, RParenLoc);
> }
>
> + /// \brief Build a new type trait expression.
> + ///
> + /// By default, performs semantic analysis to build the new expression.
> + /// Subclasses may override this routine to provide different behavior.
> + ExprResult RebuildTypeTrait(TypeTrait Trait,
> + SourceLocation StartLoc,
> + ArrayRef<TypeSourceInfo *> Args,
> + SourceLocation RParenLoc) {
> + return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
> + }
> +
> /// \brief Build a new array type trait expression.
> ///
> /// By default, performs semantic analysis to build the new expression.
> @@ -7436,6 +7447,128 @@
>
> template<typename Derived>
> ExprResult
> +TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
> + bool ArgChanged = false;
> + llvm::SmallVector<TypeSourceInfo *, 4> Args;
> + for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
> + TypeSourceInfo *From = E->getArg(I);
> + TypeLoc FromTL = From->getTypeLoc();
> + if (!isa<PackExpansionTypeLoc>(FromTL)) {
> + TypeLocBuilder TLB;
> + TLB.reserve(FromTL.getFullDataSize());
> + QualType To = getDerived().TransformType(TLB, FromTL);
> + if (To.isNull())
> + return ExprError();
> +
> + if (To == From->getType())
> + Args.push_back(From);
> + else {
> + Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
> + ArgChanged = true;
> + }
> + continue;
> + }
> +
> + ArgChanged = true;
> +
> + // We have a pack expansion. Instantiate it.
> + PackExpansionTypeLoc ExpansionTL = cast<PackExpansionTypeLoc>(FromTL);
> + TypeLoc PatternTL = ExpansionTL.getPatternLoc();
> + SmallVector<UnexpandedParameterPack, 2> Unexpanded;
> + SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
> +
> + // Determine whether the set of unexpanded parameter packs can and should
> + // be expanded.
> + bool Expand = true;
> + bool RetainExpansion = false;
> + llvm::Optional<unsigned> OrigNumExpansions
> + = ExpansionTL.getTypePtr()->getNumExpansions();
> + llvm::Optional<unsigned> NumExpansions = OrigNumExpansions;
> + if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
> + PatternTL.getSourceRange(),
> + Unexpanded,
> + Expand, RetainExpansion,
> + NumExpansions))
> + return ExprError();
> +
> + if (!Expand) {
> + // The transform has determined that we should perform a simple
> + // transformation on the pack expansion, producing another pack
> + // expansion.
> + Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
> +
> + TypeLocBuilder TLB;
> + TLB.reserve(From->getTypeLoc().getFullDataSize());
> +
> + QualType To = getDerived().TransformType(TLB, PatternTL);
> + if (To.isNull())
> + return ExprError();
> +
> + To = getDerived().RebuildPackExpansionType(To,
> + PatternTL.getSourceRange(),
> + ExpansionTL.getEllipsisLoc(),
> + NumExpansions);
> + if (To.isNull())
> + return ExprError();
> +
> + PackExpansionTypeLoc ToExpansionTL
> + = TLB.push<PackExpansionTypeLoc>(To);
> + ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
> + Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
> + continue;
> + }
> +
> + // Expand the pack expansion by substituting for each argument in the
> + // pack(s).
> + for (unsigned I = 0; I != *NumExpansions; ++I) {
> + Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
> + TypeLocBuilder TLB;
> + TLB.reserve(PatternTL.getFullDataSize());
> + QualType To = getDerived().TransformType(TLB, PatternTL);
> + if (To.isNull())
> + return ExprError();
> +
> + Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
> + }
> +
> + if (!RetainExpansion)
> + continue;
> +
> + // If we're supposed to retain a pack expansion, do so by temporarily
> + // forgetting the partially-substituted parameter pack.
> + ForgetPartiallySubstitutedPackRAII Forget(getDerived());
> +
> + TypeLocBuilder TLB;
> + TLB.reserve(From->getTypeLoc().getFullDataSize());
> +
> + QualType To = getDerived().TransformType(TLB, PatternTL);
> + if (To.isNull())
> + return ExprError();
> +
> + To = getDerived().RebuildPackExpansionType(To,
> + PatternTL.getSourceRange(),
> + ExpansionTL.getEllipsisLoc(),
> + NumExpansions);
> + if (To.isNull())
> + return ExprError();
> +
> + PackExpansionTypeLoc ToExpansionTL
> + = TLB.push<PackExpansionTypeLoc>(To);
> + ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
> + Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
> + }
> +
> + if (!getDerived().AlwaysRebuild() && !ArgChanged)
> + return SemaRef.Owned(E);
> +
> + return getDerived().RebuildTypeTrait(E->getTrait(),
> + E->getLocStart(),
> + Args,
> + E->getLocEnd());
> +}
> +
> +template<typename Derived>
> +ExprResult
> TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
> TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
> if (!T)
>
> Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Fri Feb 24 01:38:34 2012
> @@ -1327,6 +1327,17 @@
> E->RhsType = GetTypeSourceInfo(Record, Idx);
> }
>
> +void ASTStmtReader::VisitTypeTraitExpr(TypeTraitExpr *E) {
> + VisitExpr(E);
> + E->TypeTraitExprBits.NumArgs = Record[Idx++];
> + E->TypeTraitExprBits.Kind = Record[Idx++];
> + E->TypeTraitExprBits.Value = Record[Idx++];
> +
> + TypeSourceInfo **Args = E->getTypeSourceInfos();
> + for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
> + Args[I] = GetTypeSourceInfo(Record, Idx);
> +}
> +
> void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
> VisitExpr(E);
> E->ATT = (ArrayTypeTrait)Record[Idx++];
> @@ -2046,6 +2057,11 @@
> S = new (Context) BinaryTypeTraitExpr(Empty);
> break;
>
> + case EXPR_TYPE_TRAIT:
> + S = TypeTraitExpr::CreateDeserialized(Context,
> + Record[ASTStmtReader::NumExprFields]);
> + break;
> +
> case EXPR_ARRAY_TYPE_TRAIT:
> S = new (Context) ArrayTypeTraitExpr(Empty);
> break;
>
> Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Fri Feb 24 01:38:34 2012
> @@ -1341,6 +1341,16 @@
> Code = serialization::EXPR_BINARY_TYPE_TRAIT;
> }
>
> +void ASTStmtWriter::VisitTypeTraitExpr(TypeTraitExpr *E) {
> + VisitExpr(E);
> + Record.push_back(E->TypeTraitExprBits.NumArgs);
> + Record.push_back(E->TypeTraitExprBits.Kind); // FIXME: Stable encoding
> + Record.push_back(E->TypeTraitExprBits.Value);
> + for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
> + Writer.AddTypeSourceInfo(E->getArg(I), Record);
> + Code = serialization::EXPR_TYPE_TRAIT;
> +}
> +
> void ASTStmtWriter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
> VisitExpr(E);
> Record.push_back(E->getTrait());
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Fri Feb 24 01:38:34 2012
> @@ -478,6 +478,7 @@
> case Stmt::DependentScopeDeclRefExprClass:
> case Stmt::UnaryTypeTraitExprClass:
> case Stmt::BinaryTypeTraitExprClass:
> + case Stmt::TypeTraitExprClass:
> case Stmt::ArrayTypeTraitExprClass:
> case Stmt::ExpressionTraitExprClass:
> case Stmt::UnresolvedLookupExprClass:
>
> Modified: cfe/trunk/test/Index/annotate-tokens-cxx0x.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/annotate-tokens-cxx0x.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/test/Index/annotate-tokens-cxx0x.cpp (original)
> +++ cfe/trunk/test/Index/annotate-tokens-cxx0x.cpp Fri Feb 24 01:38:34 2012
> @@ -6,6 +6,11 @@
> void test() {
> int a;
> decltype(a) b;
> +
> + typedef int Integer;
> + typedef float Float;
> + typedef bool Bool;
> + bool b2 = __is_trivially_constructible(Integer, Float, Bool);
> }
>
> // RUN: c-index-test -test-annotate-tokens=%s:1:1:5:1 -fno-delayed-template-parsing -std=c++11 %s | FileCheck %s
> @@ -14,3 +19,9 @@
>
> // RUN: c-index-test -test-annotate-tokens=%s:8:1:9:1 -std=c++11 %s | FileCheck -check-prefix=CHECK-DECLTYPE %s
> // CHECK-DECLTYPE: Identifier: "a" [8:12 - 8:13] DeclRefExpr=a:7:7
> +
> +// RUN: c-index-test -test-annotate-tokens=%s:13:1:14:1 -std=c++11 %s | FileCheck -check-prefix=CHECK-TRAIT %s
> +// CHECK-TRAIT: Identifier: "Integer" [13:42 - 13:49] TypeRef=Integer:10:15
> +// CHECK-TRAIT: Identifier: "Float" [13:51 - 13:56] TypeRef=Float:11:17
> +// CHECK-TRAIT: Identifier: "Bool" [13:58 - 13:62] TypeRef=Bool:12:16
> +
>
> Modified: cfe/trunk/test/PCH/cxx-traits.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/cxx-traits.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/test/PCH/cxx-traits.cpp (original)
> +++ cfe/trunk/test/PCH/cxx-traits.cpp Fri Feb 24 01:38:34 2012
> @@ -1,8 +1,11 @@
> // Test this without pch.
> -// RUN: %clang_cc1 -include %S/cxx-traits.h -fsyntax-only -verify %s
> +// RUN: %clang_cc1 -include %S/cxx-traits.h -std=c++11 -fsyntax-only -verify %s
>
> -// RUN: %clang_cc1 -x c++-header -emit-pch -o %t %S/cxx-traits.h
> -// RUN: %clang_cc1 -include-pch %t -fsyntax-only -verify %s
> +// RUN: %clang_cc1 -x c++-header -std=c++11 -emit-pch -o %t %S/cxx-traits.h
> +// RUN: %clang_cc1 -std=c++11 -include-pch %t -fsyntax-only -verify %s
>
> bool _Is_pod_comparator = __is_pod<int>::__value;
> bool _Is_empty_check = __is_empty<int>::__value;
> +
> +bool default_construct_int = is_trivially_constructible<int>::value;
> +bool copy_construct_int = is_trivially_constructible<int, const int&>::value;
>
> Modified: cfe/trunk/test/PCH/cxx-traits.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/cxx-traits.h?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/test/PCH/cxx-traits.h (original)
> +++ cfe/trunk/test/PCH/cxx-traits.h Fri Feb 24 01:38:34 2012
> @@ -9,3 +9,8 @@
> struct __is_empty {
> enum { __value };
> };
> +
> +template<typename T, typename ...Args>
> +struct is_trivially_constructible {
> + static const bool value = __is_trivially_constructible(T, Args...);
> +};
>
> Modified: cfe/trunk/test/SemaCXX/type-traits.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/type-traits.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/type-traits.cpp (original)
> +++ cfe/trunk/test/SemaCXX/type-traits.cpp Fri Feb 24 01:38:34 2012
> @@ -47,6 +47,10 @@
> TrivialMoveButNotCopy &operator=(TrivialMoveButNotCopy&&) = default;
> TrivialMoveButNotCopy &operator=(const TrivialMoveButNotCopy&);
> };
> +struct NonTrivialDefault {
> + NonTrivialDefault();
> +};
> +
> struct HasDest { ~HasDest(); };
> class HasPriv { int priv; };
> class HasProt { protected: int prot; };
> @@ -104,6 +108,10 @@
> ~AllPrivate() throw();
> };
>
> +struct ThreeArgCtor {
> + ThreeArgCtor(int*, char*, int);
> +};
> +
> void is_pod()
> {
> { int arr[T(__is_pod(int))]; }
> @@ -1602,7 +1610,7 @@
> { int arr[F(__is_trivial(cvoid))]; }
> }
>
> -void is_trivially_copyable()
> +void trivial_checks()
> {
> { int arr[T(__is_trivially_copyable(int))]; }
> { int arr[T(__is_trivially_copyable(Enum))]; }
> @@ -1646,6 +1654,25 @@
> { int arr[F(__is_trivially_copyable(void))]; }
> { int arr[F(__is_trivially_copyable(cvoid))]; }
>
> + { int arr[T((__is_trivially_constructible(int)))]; }
> + { int arr[T((__is_trivially_constructible(int, int)))]; }
> + { int arr[T((__is_trivially_constructible(int, float)))]; }
> + { int arr[T((__is_trivially_constructible(int, int&)))]; }
> + { int arr[T((__is_trivially_constructible(int, const int&)))]; }
> + { int arr[T((__is_trivially_constructible(int, int)))]; }
> + { int arr[T((__is_trivially_constructible(HasCopyAssign, HasCopyAssign)))]; }
> + { int arr[T((__is_trivially_constructible(HasCopyAssign, const HasCopyAssign&)))]; }
> + { int arr[T((__is_trivially_constructible(HasCopyAssign, HasCopyAssign&&)))]; }
> + { int arr[T((__is_trivially_constructible(HasCopyAssign)))]; }
> + { int arr[T((__is_trivially_constructible(NonTrivialDefault,
> + const NonTrivialDefault&)))]; }
> + { int arr[T((__is_trivially_constructible(NonTrivialDefault,
> + NonTrivialDefault&&)))]; }
> +
> + { int arr[F((__is_trivially_constructible(int, int*)))]; }
> + { int arr[F((__is_trivially_constructible(NonTrivialDefault)))]; }
> + { int arr[F((__is_trivially_constructible(ThreeArgCtor, int*, char*, int&)))]; }
> +
> { int arr[T((__is_trivially_assignable(int&, int)))]; }
> { int arr[T((__is_trivially_assignable(int&, int&)))]; }
> { int arr[T((__is_trivially_assignable(int&, int&&)))]; }
> @@ -1680,6 +1707,33 @@
> TrivialMoveButNotCopy&&)))]; }
> }
>
> +// Instantiation of __is_trivially_constructible
> +template<typename T, typename ...Args>
> +struct is_trivially_constructible {
> + static const bool value = __is_trivially_constructible(T, Args...);
> +};
> +
> +void is_trivially_constructible_test() {
> + { int arr[T((is_trivially_constructible<int>::value))]; }
> + { int arr[T((is_trivially_constructible<int, int>::value))]; }
> + { int arr[T((is_trivially_constructible<int, float>::value))]; }
> + { int arr[T((is_trivially_constructible<int, int&>::value))]; }
> + { int arr[T((is_trivially_constructible<int, const int&>::value))]; }
> + { int arr[T((is_trivially_constructible<int, int>::value))]; }
> + { int arr[T((is_trivially_constructible<HasCopyAssign, HasCopyAssign>::value))]; }
> + { int arr[T((is_trivially_constructible<HasCopyAssign, const HasCopyAssign&>::value))]; }
> + { int arr[T((is_trivially_constructible<HasCopyAssign, HasCopyAssign&&>::value))]; }
> + { int arr[T((is_trivially_constructible<HasCopyAssign>::value))]; }
> + { int arr[T((is_trivially_constructible<NonTrivialDefault,
> + const NonTrivialDefault&>::value))]; }
> + { int arr[T((is_trivially_constructible<NonTrivialDefault,
> + NonTrivialDefault&&>::value))]; }
> +
> + { int arr[F((is_trivially_constructible<int, int*>::value))]; }
> + { int arr[F((is_trivially_constructible<NonTrivialDefault>::value))]; }
> + { int arr[F((is_trivially_constructible<ThreeArgCtor, int*, char*, int&>::value))]; }
> +}
> +
> void array_rank() {
> int t01[T(__array_rank(IntAr) == 1)];
> int t02[T(__array_rank(ConstIntArAr) == 2)];
>
> Modified: cfe/trunk/tools/libclang/CIndex.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/CIndex.cpp (original)
> +++ cfe/trunk/tools/libclang/CIndex.cpp Fri Feb 24 01:38:34 2012
> @@ -1755,6 +1755,7 @@
> void VisitWhileStmt(WhileStmt *W);
> void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E);
> void VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E);
> + void VisitTypeTraitExpr(TypeTraitExpr *E);
> void VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E);
> void VisitExpressionTraitExpr(ExpressionTraitExpr *E);
> void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *U);
> @@ -2056,6 +2057,11 @@
> AddTypeLoc(E->getLhsTypeSourceInfo());
> }
>
> +void EnqueueVisitor::VisitTypeTraitExpr(TypeTraitExpr *E) {
> + for (unsigned I = E->getNumArgs(); I > 0; --I)
> + AddTypeLoc(E->getArg(I-1));
> +}
> +
> void EnqueueVisitor::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
> AddTypeLoc(E->getQueriedTypeSourceInfo());
> }
>
> Modified: cfe/trunk/tools/libclang/CXCursor.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXCursor.cpp?rev=151352&r1=151351&r2=151352&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/CXCursor.cpp (original)
> +++ cfe/trunk/tools/libclang/CXCursor.cpp Fri Feb 24 01:38:34 2012
> @@ -206,6 +206,7 @@
> case Stmt::AtomicExprClass:
> case Stmt::BinaryConditionalOperatorClass:
> case Stmt::BinaryTypeTraitExprClass:
> + case Stmt::TypeTraitExprClass:
> case Stmt::CXXBindTemporaryExprClass:
> case Stmt::CXXDefaultArgExprClass:
> case Stmt::CXXScalarValueInitExprClass:
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list