Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java34
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java7
2 files changed, 40 insertions, 1 deletions
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 93a0582d0ca..81d470ebc78 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
@@ -9402,4 +9402,38 @@ public class AST2CPPTests extends AST2BaseTest {
public void testMemberAccessForArray_347298() throws Exception {
parseAndCheckBindings();
}
+
+ // 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 c7b538a33eb..4d744a4a26f 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
@@ -3047,7 +3047,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)

Back to the top