diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-10-18 02:43:19 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-10-18 02:43:19 +0000 |
commit | f333f8c40df86381db23105973587bcfdbca97a5 (patch) | |
tree | a353fd0f839d032526df4cb0a1695e62f537c461 | |
parent | 050d261ec7bb2057b007b06ac9bd2ffc541cb0f5 (diff) | |
download | bcm5719-llvm-f333f8c40df86381db23105973587bcfdbca97a5.tar.gz bcm5719-llvm-f333f8c40df86381db23105973587bcfdbca97a5.zip |
When transforming the arguments for a C++ "new" expression, make sure
to drop the implicitly-generated value initialization expression used
for initializing scalars. Fixes <rdar://problem/10283928>.
llvm-svn: 142330
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 17 | ||||
-rw-r--r-- | clang/test/SemaTemplate/instantiate-expr-1.cpp | 9 |
2 files changed, 17 insertions, 9 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index bb49eee2f33..64315ea15d0 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -6927,9 +6927,14 @@ TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { PlacementArgs, &ArgumentChanged)) return ExprError(); - // transform the constructor arguments (if any). + // Transform the constructor arguments (if any). + // As an annoying corner case, we may have introduced an implicit value- + // initialization expression when allocating a new array, which we implicitly + // drop. It will be re-created during type checking. ASTOwningVector<Expr*> ConstructorArgs(SemaRef); - if (TransformExprs(E->getConstructorArgs(), E->getNumConstructorArgs(), true, + if (!(E->isArray() && E->getNumConstructorArgs() == 1 && + isa<ImplicitValueInitExpr>(E->getConstructorArgs()[0])) && + TransformExprs(E->getConstructorArgs(), E->getNumConstructorArgs(), true, ConstructorArgs, &ArgumentChanged)) return ExprError(); @@ -7028,13 +7033,9 @@ TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { AllocType, AllocTypeInfo, ArraySize.get(), - /*FIXME:*/E->hasInitializer() - ? E->getLocStart() - : SourceLocation(), + E->getConstructorLParen(), move_arg(ConstructorArgs), - /*FIXME:*/E->hasInitializer() - ? E->getLocEnd() - : SourceLocation()); + E->getConstructorRParen()); } template<typename Derived> diff --git a/clang/test/SemaTemplate/instantiate-expr-1.cpp b/clang/test/SemaTemplate/instantiate-expr-1.cpp index 896437488d6..08f5e9d9a7f 100644 --- a/clang/test/SemaTemplate/instantiate-expr-1.cpp +++ b/clang/test/SemaTemplate/instantiate-expr-1.cpp @@ -167,8 +167,15 @@ namespace PR6424 { new X(); // expected-note{{instantiation of}} } }; - + template void Y2<3>::f(); + + template<typename T> + void rdar10283928(int count) { + (void)new char[count](); + } + + template void rdar10283928<int>(int); } namespace PR10864 { |