[cfe-commits] r94967 - in /cfe/trunk/lib: CodeGen/CGExprCXX.cpp Sema/Sema.h Sema/SemaDeclCXX.cpp Sema/SemaExprCXX.cpp
Eli Friedman
eli.friedman at gmail.com
Sun Jan 31 12:58:15 PST 2010
Author: efriedma
Date: Sun Jan 31 14:58:15 2010
New Revision: 94967
URL: http://llvm.org/viewvc/llvm-project?rev=94967&view=rev
Log:
Switch expressions like T() and T(1,2) over to new-style initialization. I'm
not quite sure what we want to do about the AST representation; comments
welcome.
Modified:
cfe/trunk/lib/CodeGen/CGExprCXX.cpp
cfe/trunk/lib/Sema/Sema.h
cfe/trunk/lib/Sema/SemaDeclCXX.cpp
cfe/trunk/lib/Sema/SemaExprCXX.cpp
Modified: cfe/trunk/lib/CodeGen/CGExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprCXX.cpp?rev=94967&r1=94966&r2=94967&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprCXX.cpp Sun Jan 31 14:58:15 2010
@@ -60,7 +60,7 @@
}
// We can always devirtualize calls on temporary object expressions.
- if (isa<CXXTemporaryObjectExpr>(Base))
+ if (isa<CXXConstructExpr>(Base))
return true;
// And calls on bound temporaries.
Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=94967&r1=94966&r2=94967&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Sun Jan 31 14:58:15 2010
@@ -1924,12 +1924,6 @@
bool RequiresZeroInit = false,
bool BaseInitialization = false);
- OwningExprResult BuildCXXTemporaryObjectExpr(CXXConstructorDecl *Cons,
- QualType writtenTy,
- SourceLocation tyBeginLoc,
- MultiExprArg Args,
- SourceLocation rParenLoc);
-
OwningExprResult BuildCXXCastArgument(SourceLocation CastLoc,
QualType Ty,
CastExpr::CastKind Kind,
@@ -1983,14 +1977,6 @@
Expr **Args, unsigned NumArgs,
SourceLocation Loc,
InitializationKind Kind);
-
- CXXConstructorDecl *
- PerformInitializationByConstructor(QualType ClassType,
- MultiExprArg ArgsPtr,
- SourceLocation Loc, SourceRange Range,
- DeclarationName InitEntity,
- InitializationKind Kind,
- ASTOwningVector<&ActionBase::DeleteExpr> &ConvertedArgs);
bool CompleteConstructorCall(CXXConstructorDecl *Constructor,
MultiExprArg ArgsPtr,
Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=94967&r1=94966&r2=94967&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Sun Jan 31 14:58:15 2010
@@ -3965,22 +3965,6 @@
RequiresZeroInit, BaseInitialization));
}
-Sema::OwningExprResult
-Sema::BuildCXXTemporaryObjectExpr(CXXConstructorDecl *Constructor,
- QualType Ty,
- SourceLocation TyBeginLoc,
- MultiExprArg Args,
- SourceLocation RParenLoc) {
- unsigned NumExprs = Args.size();
- Expr **Exprs = (Expr **)Args.release();
-
- MarkDeclarationReferenced(TyBeginLoc, Constructor);
- return Owned(new (Context) CXXTemporaryObjectExpr(Context, Constructor, Ty,
- TyBeginLoc, Exprs,
- NumExprs, RParenLoc));
-}
-
-
bool Sema::InitializeVarWithConstructor(VarDecl *VD,
CXXConstructorDecl *Constructor,
MultiExprArg Exprs) {
@@ -4218,92 +4202,6 @@
return 0;
}
-/// \brief Perform initialization by constructor (C++ [dcl.init]p14), which
-/// may occur as part of direct-initialization or copy-initialization.
-///
-/// \param ClassType the type of the object being initialized, which must have
-/// class type.
-///
-/// \param ArgsPtr the arguments provided to initialize the object
-///
-/// \param Loc the source location where the initialization occurs
-///
-/// \param Range the source range that covers the entire initialization
-///
-/// \param InitEntity the name of the entity being initialized, if known
-///
-/// \param Kind the type of initialization being performed
-///
-/// \param ConvertedArgs a vector that will be filled in with the
-/// appropriately-converted arguments to the constructor (if initialization
-/// succeeded).
-///
-/// \returns the constructor used to initialize the object, if successful.
-/// Otherwise, emits a diagnostic and returns NULL.
-CXXConstructorDecl *
-Sema::PerformInitializationByConstructor(QualType ClassType,
- MultiExprArg ArgsPtr,
- SourceLocation Loc, SourceRange Range,
- DeclarationName InitEntity,
- InitializationKind Kind,
- ASTOwningVector<&ActionBase::DeleteExpr> &ConvertedArgs) {
-
- // Build the overload candidate set
- Expr **Args = (Expr **)ArgsPtr.get();
- unsigned NumArgs = ArgsPtr.size();
- OverloadCandidateSet CandidateSet;
- AddConstructorInitializationCandidates(*this, ClassType, Args, NumArgs, Kind,
- CandidateSet);
-
- OverloadCandidateSet::iterator Best;
- switch (BestViableFunction(CandidateSet, Loc, Best)) {
- case OR_Success:
- // We found a constructor. Break out so that we can convert the arguments
- // appropriately.
- break;
-
- case OR_No_Viable_Function:
- if (InitEntity)
- Diag(Loc, diag::err_ovl_no_viable_function_in_init)
- << InitEntity << Range;
- else
- Diag(Loc, diag::err_ovl_no_viable_function_in_init)
- << ClassType << Range;
- PrintOverloadCandidates(CandidateSet, OCD_AllCandidates, Args, NumArgs);
- return 0;
-
- case OR_Ambiguous:
- if (InitEntity)
- Diag(Loc, diag::err_ovl_ambiguous_init) << InitEntity << Range;
- else
- Diag(Loc, diag::err_ovl_ambiguous_init) << ClassType << Range;
- PrintOverloadCandidates(CandidateSet, OCD_ViableCandidates, Args, NumArgs);
- return 0;
-
- case OR_Deleted:
- if (InitEntity)
- Diag(Loc, diag::err_ovl_deleted_init)
- << Best->Function->isDeleted()
- << InitEntity << Range;
- else {
- const CXXRecordDecl *RD =
- cast<CXXRecordDecl>(ClassType->getAs<RecordType>()->getDecl());
- Diag(Loc, diag::err_ovl_deleted_init)
- << Best->Function->isDeleted()
- << RD->getDeclName() << Range;
- }
- PrintOverloadCandidates(CandidateSet, OCD_AllCandidates, Args, NumArgs);
- return 0;
- }
-
- // Convert the arguments, fill in default arguments, etc.
- CXXConstructorDecl *Constructor = cast<CXXConstructorDecl>(Best->Function);
- if (CompleteConstructorCall(Constructor, move(ArgsPtr), Loc, ConvertedArgs))
- return 0;
-
- return Constructor;
-}
-
/// \brief Given a constructor and the set of arguments provided for the
/// constructor, convert the arguments and add any required default arguments
/// to form a proper call to this constructor.
Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=94967&r1=94966&r2=94967&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Sun Jan 31 14:58:15 2010
@@ -263,29 +263,18 @@
if (NumExprs > 1 || !Record->hasTrivialConstructor() ||
!Record->hasTrivialDestructor()) {
- ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(*this);
-
- CXXConstructorDecl *Constructor
- = PerformInitializationByConstructor(Ty, move(exprs),
- TypeRange.getBegin(),
- SourceRange(TypeRange.getBegin(),
- RParenLoc),
- DeclarationName(),
- InitializationKind::CreateDirect(TypeRange.getBegin(),
- LParenLoc,
- RParenLoc),
- ConstructorArgs);
-
- if (!Constructor)
- return ExprError();
-
- OwningExprResult Result =
- BuildCXXTemporaryObjectExpr(Constructor, Ty, TyBeginLoc,
- move_arg(ConstructorArgs), RParenLoc);
- if (Result.isInvalid())
- return ExprError();
+ InitializedEntity Entity = InitializedEntity::InitializeTemporary(Ty);
+ InitializationKind Kind
+ = NumExprs ? InitializationKind::CreateDirect(TypeRange.getBegin(),
+ LParenLoc, RParenLoc)
+ : InitializationKind::CreateValue(TypeRange.getBegin(),
+ LParenLoc, RParenLoc);
+ InitializationSequence InitSeq(*this, Entity, Kind, Exprs, NumExprs);
+ OwningExprResult Result = InitSeq.Perform(*this, Entity, Kind,
+ move(exprs));
- return MaybeBindToTemporary(Result.takeAs<Expr>());
+ // FIXME: Improve AST representation?
+ return move(Result);
}
// Fall through to value-initialize an object of class type that
More information about the cfe-commits
mailing list