summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-10-18 02:43:19 +0000
committerDouglas Gregor <dgregor@apple.com>2011-10-18 02:43:19 +0000
commitf333f8c40df86381db23105973587bcfdbca97a5 (patch)
treea353fd0f839d032526df4cb0a1695e62f537c461 /clang/lib
parent050d261ec7bb2057b007b06ac9bd2ffc541cb0f5 (diff)
downloadbcm5719-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
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/TreeTransform.h17
1 files changed, 9 insertions, 8 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>
OpenPOWER on IntegriCloud