diff options
author | Matheus Izvekov <mizvekov@gmail.com> | 2021-09-15 01:46:30 +0200 |
---|---|---|
committer | Tom Stellard <tstellar@redhat.com> | 2021-09-24 09:18:10 -0700 |
commit | d7b669b3a30345cfcdb2fde2af6f48aa4b94845d (patch) | |
tree | a12dc3351fad673c0c38c047efd9b3627629c1ae /clang/lib/Sema/SemaDeclCXX.cpp | |
parent | ee6913cc8317c08b603daed64b07a17a95ec926a (diff) | |
download | llvmorg-13.0.0-rc4.tar.gz |
[clang] don't mark as Elidable CXXConstruct expressions used in NRVOllvmorg-13.0.0-rc4llvmorg-13.0.0
See PR51862.
The consumers of the Elidable flag in CXXConstructExpr assume that
an elidable construction just goes through a single copy/move construction,
so that the source object is immediately passed as an argument and is the same
type as the parameter itself.
With the implementation of P2266 and after some adjustments to the
implementation of P1825, we started (correctly, as per standard)
allowing more cases where the copy initialization goes through
user defined conversions.
With this patch we stop using this flag in NRVO contexts, to preserve code
that relies on that assumption.
This causes no known functional changes, we just stop firing some asserts
in a cople of included test cases.
Reviewed By: rsmith
Differential Revision: https://reviews.llvm.org/D109800
(cherry picked from commit d9308aa39b236064a680ca57178af3c731e13e49)
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index da4f4f862095..ac01beb1bf93 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -15262,8 +15262,17 @@ Sema::BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType, // can be omitted by constructing the temporary object // directly into the target of the omitted copy/move if (ConstructKind == CXXConstructExpr::CK_Complete && Constructor && + // FIXME: Converting constructors should also be accepted. + // But to fix this, the logic that digs down into a CXXConstructExpr + // to find the source object needs to handle it. + // Right now it assumes the source object is passed directly as the + // first argument. Constructor->isCopyOrMoveConstructor() && hasOneRealArgument(ExprArgs)) { Expr *SubExpr = ExprArgs[0]; + // FIXME: Per above, this is also incorrect if we want to accept + // converting constructors, as isTemporaryObject will + // reject temporaries with different type from the + // CXXRecord itself. Elidable = SubExpr->isTemporaryObject( Context, cast<CXXRecordDecl>(FoundDecl->getDeclContext())); } |