]> granicus.if.org Git - clang/commitdiff
Return statements are initialization; don't forget to revert the initializer to
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 21 Aug 2014 20:51:13 +0000 (20:51 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 21 Aug 2014 20:51:13 +0000 (20:51 +0000)
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

lib/Sema/TreeTransform.h
test/SemaTemplate/instantiate-init.cpp

index a0524bd2284200df5a38ac83685a828741e5713d..4ba7bdf3da53ea8185ac609ec1179b528421c836 100644 (file)
@@ -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();
 
index 22c70be3a8dc0305ad097235d5b27904fd388325..7a33aec66538467dc2e34639dcfb1f2f0e14e484 100644 (file)
@@ -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>();
+}