diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-08-21 20:51:13 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-08-21 20:51:13 +0000 |
commit | 3b717527f4e41337e90ef47f743543f25cb4949c (patch) | |
tree | acff5f0b59dd7f667398f0424171ddb590b9e5ae /clang | |
parent | 1961f14cf965e63d944d8888a089067cde142d10 (diff) | |
download | bcm5719-llvm-3b717527f4e41337e90ef47f743543f25cb4949c.tar.gz bcm5719-llvm-3b717527f4e41337e90ef47f743543f25cb4949c.zip |
Return statements are initialization; don't forget to revert the initializer to
its syntactic form before re-analyzing it during template instantiation.
llvm-svn: 216224
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 3 | ||||
-rw-r--r-- | clang/test/SemaTemplate/instantiate-init.cpp | 9 |
2 files changed, 11 insertions, 1 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index a0524bd2284..4ba7bdf3da5 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -5821,7 +5821,8 @@ TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { template<typename Derived> StmtResult TreeTransform<Derived>::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/clang/test/SemaTemplate/instantiate-init.cpp b/clang/test/SemaTemplate/instantiate-init.cpp index 22c70be3a8d..7a33aec6653 100644 --- a/clang/test/SemaTemplate/instantiate-init.cpp +++ b/clang/test/SemaTemplate/instantiate-init.cpp @@ -133,3 +133,12 @@ namespace PR16903 { fun(in); } } + +namespace ReturnStmtIsInitialization { + struct X { + X() {} + X(const X &) = delete; + }; + template<typename T> X f() { return {}; } + auto &&x = f<void>(); +} |