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 b072be735fc..0739613ba2a 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 @@ -5921,4 +5921,21 @@ public class AST2CPPTests extends AST2BaseTest { public void testTypeid_Bug209578() throws Exception { parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP); } + + + // typedef char* t1; + // typedef char t2[8]; + // void test(char * x) {} + // int main(void) { + // char x[12]; + // t1 y; + // t2 z; + // test(x); + // test(y); + // test(z); + // } + public void testArrayToPtrConversionForTypedefs_Bug239931() throws Exception { + parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java index c9af08f157e..9546d29f263 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java @@ -68,15 +68,17 @@ public class Conversions { Cost cost; allowUDC &= !isImpliedObject; + target= getUltimateTypeViaTypedefs(target); + source= getUltimateTypeViaTypedefs(source); if (target instanceof ICPPReferenceType) { // [13.3.3.3.1] Reference binding - IType cv1T1= ((ICPPReferenceType)target).getType(); + IType cv1T1= getUltimateTypeViaTypedefs(((ICPPReferenceType)target).getType()); cost= new Cost(source, cv1T1); cost.targetHadReference= true; boolean lvalue= sourceExp == null || !CPPVisitor.isRValue(sourceExp); - IType T2= source instanceof IQualifierType ? ((IQualifierType)source).getType() : source; + IType T2= source instanceof IQualifierType ? getUltimateTypeViaTypedefs(((IQualifierType)source).getType()) : source; if (lvalue && isReferenceCompatible(cv1T1, source)) { /* Direct reference binding */