From be01bfb2ce9cbb051a11ebe5139b60b7a56c3ad5 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 4 Jul 2011 10:43:59 +0200 Subject: [PATCH] Bug 347462: Detection of implicitly called copy ctor. --- .../core/parser/tests/ast2/AST2CPPTests.java | 33 +++++++++++++++++++ .../parser/cpp/semantics/CPPSemantics.java | 7 +++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index c64ca6ddbb2..092e1498ab9 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -9391,4 +9391,37 @@ public class AST2CPPTests extends AST2BaseTest { assertTrue(qn.isDeclaration()); assertTrue(qn.getLastName().isDeclaration()); } + + // struct X {}; + // struct Y : X { + // Y(){} + // Y(Y const & y){} + // }; + // void test() { + // Y y; + // Y y2 = y; + // X x = y2; + // } + public void testReferenceToCopyConstructor() throws Exception { + IASTTranslationUnit tu= parseAndCheckBindings(); + ICPPASTFunctionDefinition fdef= getDeclaration(tu, 2); + + IASTDeclarationStatement dst= getStatement(fdef, 0); + IASTDeclarator dtor= ((IASTSimpleDeclaration) dst.getDeclaration()).getDeclarators()[0]; + IBinding ctor= ((IASTImplicitNameOwner) dtor).getImplicitNames()[0].resolveBinding(); + assertTrue(ctor instanceof ICPPConstructor); + assertEquals(0, ((ICPPConstructor) ctor).getType().getParameterTypes().length); + + dst= getStatement(fdef, 1); + dtor= ((IASTSimpleDeclaration) dst.getDeclaration()).getDeclarators()[0]; + ctor= ((IASTImplicitNameOwner) dtor).getImplicitNames()[0].resolveBinding(); + assertTrue(ctor instanceof ICPPConstructor); + assertEquals(1, ((ICPPConstructor) ctor).getType().getParameterTypes().length); + + dst= getStatement(fdef, 2); + dtor= ((IASTSimpleDeclaration) dst.getDeclaration()).getDeclarators()[0]; + ctor= ((IASTImplicitNameOwner) dtor).getImplicitNames()[0].resolveBinding(); + assertTrue(ctor instanceof ICPPConstructor); + assertEquals(1, ((ICPPConstructor) ctor).getType().getParameterTypes().length); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index c3661edffcd..13d54fed2dc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -3111,7 +3111,12 @@ public class CPPSemantics { sourceType= new InitializerListType((ICPPASTInitializerList) initClause); } if (sourceType != null) { - Cost c= Conversions.checkImplicitConversionSequence(type, sourceType, isLValue, UDCMode.ALLOWED, Context.ORDINARY); + Cost c; + if (calculateInheritanceDepth(sourceType, classType) >= 0) { + c = Conversions.copyInitializationOfClass(isLValue, sourceType, classType, false); + } else { + c = Conversions.checkImplicitConversionSequence(type, sourceType, isLValue, UDCMode.ALLOWED, Context.ORDINARY); + } if (c.converts()) { ICPPFunction f = c.getUserDefinedConversion(); if (f instanceof ICPPConstructor)