From: Richard Smith Date: Thu, 21 Aug 2014 20:51:13 +0000 (+0000) Subject: Return statements are initialization; don't forget to revert the initializer to X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=16169e7c0fec3bc715ce59d1612c619f2516e857;p=clang Return statements are initialization; don't forget to revert the initializer to its syntactic form before re-analyzing it during template instantiation. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216224 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index a0524bd228..4ba7bdf3da 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -5821,7 +5821,8 @@ TreeTransform::TransformBreakStmt(BreakStmt *S) { template StmtResult TreeTransform::TransformReturnStmt(ReturnStmt *S) { - ExprResult Result = getDerived().TransformExpr(S->getRetValue()); + ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), + /*NotCopyInit*/false); if (Result.isInvalid()) return StmtError(); diff --git a/test/SemaTemplate/instantiate-init.cpp b/test/SemaTemplate/instantiate-init.cpp index 22c70be3a8..7a33aec665 100644 --- a/test/SemaTemplate/instantiate-init.cpp +++ b/test/SemaTemplate/instantiate-init.cpp @@ -133,3 +133,12 @@ namespace PR16903 { fun(in); } } + +namespace ReturnStmtIsInitialization { + struct X { + X() {} + X(const X &) = delete; + }; + template X f() { return {}; } + auto &&x = f(); +}