diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-12-14 16:27:04 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-12-14 16:27:04 +0000 |
commit | db121bad2aeccac3f0e504b79e527efecef98a91 (patch) | |
tree | dcde8b68d5deebecf97cc98533738c49dfa67445 | |
parent | 525dda05a0dfdfdb3ffce086bf8b3156b72dae21 (diff) | |
download | bcm5719-llvm-db121bad2aeccac3f0e504b79e527efecef98a91.tar.gz bcm5719-llvm-db121bad2aeccac3f0e504b79e527efecef98a91.zip |
When rebuilding CXXConstructExprs after a transformation, use
CompleteConstructorCall to perform type-checking.
llvm-svn: 91279
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 15 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/constructor-convert.cpp | 19 |
2 files changed, 29 insertions, 5 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index dc848a53ab5..b1d7f064894 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -1459,13 +1459,17 @@ public: /// By default, performs semantic analysis to build the new expression. /// Subclasses may override this routine to provide different behavior. OwningExprResult RebuildCXXConstructExpr(QualType T, + SourceLocation Loc, CXXConstructorDecl *Constructor, bool IsElidable, MultiExprArg Args) { - return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/ - SourceLocation(), - T, Constructor, IsElidable, - move(Args)); + ASTOwningVector<&ActionBase::DeleteExpr> ConvertedArgs(SemaRef); + if (getSema().CompleteConstructorCall(Constructor, move(Args), Loc, + ConvertedArgs)) + return getSema().ExprError(); + + return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable, + move_arg(ConvertedArgs)); } /// \brief Build a new object-construction expression. @@ -4723,7 +4727,8 @@ TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { !ArgumentChanged) return SemaRef.Owned(E->Retain()); - return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(), + return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), + Constructor, E->isElidable(), move_arg(Args)); } diff --git a/clang/test/CodeGenCXX/constructor-convert.cpp b/clang/test/CodeGenCXX/constructor-convert.cpp new file mode 100644 index 00000000000..6fa6d556dc5 --- /dev/null +++ b/clang/test/CodeGenCXX/constructor-convert.cpp @@ -0,0 +1,19 @@ +// RUN: clang -emit-llvm -S -o - %s + +// PR5775 +class Twine { + Twine(const char *Str) { } +}; + +static void error(const Twine &Message); + +template<typename> +struct opt_storage { + void f() { + error("cl::location(x) specified more than once!"); + } +}; + +void f(opt_storage<int> o) { + o.f(); +} |