Index: cp/init.c
===================================================================
--- cp/init.c	(revision 192814)
+++ cp/init.c	(working copy)
@@ -2911,7 +2911,8 @@ build_new (VEC(tree,gc) **placement, tree type, tr
 
       orig_placement = make_tree_vector_copy (*placement);
       orig_nelts = nelts;
-      orig_init = make_tree_vector_copy (*init);
+      if (*init)
+	orig_init = make_tree_vector_copy (*init);
 
       make_args_non_dependent (*placement);
       if (nelts)
Index: testsuite/g++.dg/template/new11.C
===================================================================
--- testsuite/g++.dg/template/new11.C	(revision 0)
+++ testsuite/g++.dg/template/new11.C	(working copy)
@@ -0,0 +1,18 @@
+// PR c++/54984
+// { dg-options "-fdump-tree-original" }
+
+template <class T>
+struct Foo
+{
+  Foo(__SIZE_TYPE__ size) : x(new char[size]) {}
+  char *x;
+};
+
+int main()
+{
+  __SIZE_TYPE__ size = 1000;
+  Foo<char> foo(size);
+}
+
+// { dg-final { scan-tree-dump-not "goto" "original" } }
+// { dg-final { cleanup-tree-dump "original" } }
