[CFG] [analyzer] Allow elidable copies to have more than one arguments.

Copy-constructors and move-constructors may have default arguments. It is
incorrect to assert that they only have one argument, i.e. the reference to the
object being copied or moved. Remove the assertion.

Differential Revision: https://reviews.llvm.org/D49215

llvm-svn: 337229
This commit is contained in:
Artem Dergachev 2018-07-17 00:57:57 +00:00
parent 35dbd0b1ff
commit 8ac6c9dd67
2 changed files with 23 additions and 1 deletions

View File

@ -1263,7 +1263,6 @@ void CFGBuilder::findConstructionContexts(
// Support pre-C++17 copy elision AST.
auto *CE = cast<CXXConstructExpr>(Child);
if (BuildOpts.MarkElidedCXXConstructors && CE->isElidable()) {
assert(CE->getNumArgs() == 1);
findConstructionContexts(withExtraLayer(CE), CE->getArg(0));
}

View File

@ -878,3 +878,26 @@ void passArgumentWithDestructorByReference() {
useDByReference(D());
}
} // end namespace argument_constructors
namespace copy_elision_with_extra_arguments {
class C {
public:
C();
C(const C &c, int x = 0);
};
// CHECK: void testCopyElisionWhenCopyConstructorHasExtraArguments()
// CHECK: [B1]
// CXX11-ELIDE-NEXT: 1: copy_elision_with_extra_arguments::C() (CXXConstructExpr, [B1.3], [B1.5], class copy_elision_with_extra_arguments::C)
// CXX11-NOELIDE-NEXT: 1: copy_elision_with_extra_arguments::C() (CXXConstructExpr, [B1.3], class copy_elision_with_extra_arguments::C)
// CXX11-NEXT: 2: [B1.1] (ImplicitCastExpr, NoOp, const class copy_elision_with_extra_arguments::C)
// CXX11-NEXT: 3: [B1.2]
// CXX11-NEXT: 4:
// CXX11-NEXT: 5: [B1.3] (CXXConstructExpr, [B1.6], class copy_elision_with_extra_arguments::C)
// CXX11-NEXT: 6: copy_elision_with_extra_arguments::C c = copy_elision_with_extra_arguments::C();
// CXX17-NEXT: 1: copy_elision_with_extra_arguments::C() (CXXConstructExpr, [B1.2], class copy_elision_with_extra_arguments::C)
// CXX17-NEXT: 2: copy_elision_with_extra_arguments::C c = copy_elision_with_extra_arguments::C();
void testCopyElisionWhenCopyConstructorHasExtraArguments() {
C c = C();
}
} // namespace copy_elision_with_extra_arguments