forked from OSchip/llvm-project
[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:
parent
35dbd0b1ff
commit
8ac6c9dd67
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue