From 424c2898fed5dfbcc0f65443b1b8450e3607a5ef Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Wed, 4 Dec 2013 19:47:59 -0800 Subject: [PATCH] Bug 423127 - Template resolution gets confused by "void" in a parameter list Change-Id: I6d2510ce7f1c8007da7121855bc4870e4a57d15d Reviewed-on: https://git.eclipse.org/r/19355 Tested-by: Hudson CI Reviewed-by: Sergey Prigogin IP-Clean: Sergey Prigogin Tested-by: Sergey Prigogin --- .../core/parser/tests/ast2/AST2CPPTests.java | 16 ++++++-------- .../parser/tests/ast2/AST2TemplateTests.java | 17 +++++++++++++++ .../cdt/core/parser/tests/ast2/AST2Tests.java | 21 ++++++------------- .../tests/ast2/CompleteParser2Tests.java | 3 +-- .../tests/IndexCBindingResolutionBugs.java | 5 ++--- .../index/tests/IndexUpdateTests.java | 10 ++++----- .../dom/parser/GCCBuiltinSymbolProvider.java | 11 ++++++---- .../internal/core/dom/parser/c/CFunction.java | 4 ++++ .../internal/core/dom/parser/c/CVisitor.java | 4 ++++ .../core/dom/parser/cpp/CPPClassScope.java | 17 +++++++-------- .../core/dom/parser/cpp/CPPFunction.java | 15 +++++++------ .../dom/parser/cpp/CPPFunctionTemplate.java | 4 ++++ .../parser/cpp/CPPImplicitConstructor.java | 6 +++--- .../dom/parser/cpp/semantics/CPPVisitor.java | 4 ++++ 14 files changed, 80 insertions(+), 57 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 e9e55cf8d9f..a2ee13bb1e4 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 @@ -1275,17 +1275,13 @@ public class AST2CPPTests extends AST2TestBase { ICPPConstructor[] ctors = A.getConstructors(); assertNotNull(ctors); - assertEquals(ctors.length, 2); + assertEquals(2, ctors.length); - assertEquals(ctors[0].getParameters().length, 1); + assertEquals(0, ctors[0].getParameters().length); - IType t = ctors[0].getParameters()[0].getType(); - assertTrue(t instanceof IBasicType); - assertEquals(((IBasicType) t).getType(), IBasicType.t_void); + assertEquals(1, ctors[1].getParameters().length); - assertEquals(ctors[1].getParameters().length, 1); - - t = ctors[1].getParameters()[0].getType(); + IType t = ctors[1].getParameters()[0].getType(); assertTrue(t instanceof ICPPReferenceType); assertTrue(((ICPPReferenceType) t).getType() instanceof IQualifierType); IQualifierType qt = (IQualifierType) ((ICPPReferenceType) t).getType(); @@ -1305,8 +1301,8 @@ public class AST2CPPTests extends AST2TestBase { assertNotNull(ctors); assertEquals(ctors.length, 2); - assertEquals(ctors[0].getParameters().length, 1); - assertEquals(ctors[1].getParameters().length, 1); + assertEquals(0, ctors[0].getParameters().length); + assertEquals(1, ctors[1].getParameters().length); IType t = ctors[1].getParameters()[0].getType(); assertTrue(t instanceof ICPPReferenceType); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 391f8eddb9e..00e661556e4 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -5617,6 +5617,23 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // template + // void A(T1* obj, void (T2::*member)(U)); + // + // template + // void A(T1* obj, void (T2::*member)()); + // + // class B { + // void m1(void); + // + // void m2() { + // A(this, &B::m1); + // } + // }; + public void testFunctionWithVoidParamInTypeDeduction_423127() throws Exception { + parseAndCheckBindings(); + } + // template struct Templ { // Templ(){} // }; diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index 4eaa0621f54..02fc18b3c28 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -22,6 +22,7 @@ import java.io.IOException; import junit.framework.TestSuite; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; +import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.EScopeKind; import org.eclipse.cdt.core.dom.ast.ExpansionOverlapsBoundaryException; import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator; @@ -41,7 +42,6 @@ import org.eclipse.cdt.core.dom.ast.IASTDoStatement; import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; -import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTEqualsInitializer; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpressionList; @@ -2288,10 +2288,8 @@ public class AST2Tests extends AST2TestBase { assertTrue(gt_2 instanceof IFunctionType); IType gt_ret = ((IFunctionType) gt_2).getReturnType(); assertTrue(gt_ret instanceof IBasicType); - assertEquals(((IBasicType) gt_ret).getType(), IBasicType.t_int); - IType gt_parm = ((IFunctionType) gt_2).getParameterTypes()[0]; - assertTrue(gt_parm instanceof IBasicType); - assertEquals(((IBasicType) gt_parm).getType(), IBasicType.t_void); + assertEquals(((IBasicType) gt_ret).getKind(), IBasicType.Kind.eInt); + assertEquals(0, ((IFunctionType) gt_2).getParameterTypes().length); // test tu.getDeclarationsInAST(IBinding) assertTrue(def.getDeclarator() instanceof IASTStandardFunctionDeclarator); @@ -4970,31 +4968,24 @@ public class AST2Tests extends AST2TestBase { } // typedef void VOID; - // VOID func(VOID) { + // VOID func(void) { // } public void testTypedefVoid_221567() throws Exception { String code= getAboveComment(); for (ParserLanguage lang: ParserLanguage.values()) { BindingAssertionHelper ba= new BindingAssertionHelper(code, lang); ITypedef td= ba.assertNonProblem("VOID;", 4, ITypedef.class); - IBinding ref= ba.assertNonProblem("VOID)", 4); - assertSame(td, ref); IFunction func= ba.assertNonProblem("func", 4, IFunction.class); IFunctionType ft= func.getType(); IType rt= ft.getReturnType(); IType[] pts= ft.getParameterTypes(); - assertEquals(1, pts.length); - IType pt = pts[0]; + assertEquals(0, pts.length); assertInstance(rt, ITypedef.class); - assertInstance(pt, ITypedef.class); rt= ((ITypedef) rt).getType(); - pt= ((ITypedef) pt).getType(); assertTrue(rt instanceof IBasicType); - assertEquals(IBasicType.t_void, ((IBasicType) rt).getType()); - assertTrue(pt instanceof IBasicType); - assertEquals(IBasicType.t_void, ((IBasicType) pt).getType()); + assertEquals(IBasicType.Kind.eVoid, ((IBasicType) rt).getKind()); } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CompleteParser2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CompleteParser2Tests.java index ce4e416fb33..f79a56c9cd1 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CompleteParser2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CompleteParser2Tests.java @@ -417,8 +417,7 @@ public class CompleteParser2Tests extends BaseTestCase { IFunction foo = (IFunction) col.getName(0).resolveBinding(); IParameter p = (IParameter) col.getName(1).resolveBinding(); - assertEquals(foo.getParameters().length, 1); - assertSame(foo.getParameters()[0], p); + assertEquals(0, foo.getParameters().length); assertSame(p.getScope(), foo.getFunctionScope()); } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionBugs.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionBugs.java index ea7a3a80dd6..2cff7de8440 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionBugs.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionBugs.java @@ -70,11 +70,10 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase assertTrue(b0 instanceof IFunction); IFunction f0 = (IFunction) b0; IParameter[] params= f0.getParameters(); - assertEquals(1, params.length); - IType param= params[0].getType(); - assertTrue(param instanceof IBasicType); + assertEquals(0, params.length); IType returnType= f0.getType().getReturnType(); assertTrue(returnType instanceof IBasicType); + assertEquals(IBasicType.Kind.eVoid, ((IBasicType) returnType).getKind()); } // void func1(void); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexUpdateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexUpdateTests.java index 98344123a54..69fbb526aa0 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexUpdateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexUpdateTests.java @@ -542,7 +542,7 @@ public class IndexUpdateTests extends IndexTestBase { new String[] {IMPLICIT, PUBLIC}); updateFile(); checkImplicitMethods("MyClass", - null, // no default constructor, because we declared the copy constr. + null, // no default constructor, because we declared the copy constructor. new String[] {EXPLICIT, PRIVATE}, new String[] {IMPLICIT, PUBLIC}); updateFile(); @@ -563,7 +563,7 @@ public class IndexUpdateTests extends IndexTestBase { final char[] nchars = name.toCharArray(); final String refType = name + " &"; final String constRefType = "const " + refType; - IIndexBinding[] ctors= fIndex.findBindings(new char[][]{nchars, nchars}, IndexFilter.ALL_DECLARED_OR_IMPLICIT, npm()); + IIndexBinding[] ctors= fIndex.findBindings(new char[][] {nchars, nchars}, IndexFilter.ALL_DECLARED_OR_IMPLICIT, npm()); int count= 0; for (int i = 0; i < ctors.length; i++) { @@ -574,13 +574,13 @@ public class IndexUpdateTests extends IndexTestBase { } assertEquals(m1 == null ? 1 : 2, count); final IType[] parameterTypes = ((ICPPConstructor) ctors[0]).getType().getParameterTypes(); - if (parameterTypes.length!=1 || !(parameterTypes[0] instanceof ICPPReferenceType)) { + if (parameterTypes.length != 1 || !(parameterTypes[0] instanceof ICPPReferenceType)) { IIndexBinding h= ctors[0]; ctors[0]= ctors[1]; ctors[1]= h; } if (m1 != null) { - checkCppConstructor((ICPPConstructor) ctors[1], new String[]{"", "void"}, m1); + checkCppConstructor((ICPPConstructor) ctors[1], new String[] {""}, m1); } - checkCppConstructor((ICPPConstructor) ctors[0], new String[]{"", constRefType}, m2); + checkCppConstructor((ICPPConstructor) ctors[0], new String[] {"", constRefType}, m2); IIndexBinding[] assignmentOps= fIndex.findBindings( new char[][] {nchars, "operator =".toCharArray() }, IndexFilter.ALL_DECLARED_OR_IMPLICIT, npm()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/GCCBuiltinSymbolProvider.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/GCCBuiltinSymbolProvider.java index e594c3f1810..8d773c16e79 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/GCCBuiltinSymbolProvider.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/GCCBuiltinSymbolProvider.java @@ -459,7 +459,9 @@ public class GCCBuiltinSymbolProvider implements IBuiltinBindingsProvider { private void function(String returnType, String name, String... parameterTypes) { int len = parameterTypes.length; - boolean varargs= len > 0 && parameterTypes[len-1].equals("..."); + if (len == 1 && parameterTypes[0].equals("void")) + len--; + boolean varargs= len > 0 && parameterTypes[len - 1].equals("..."); if (varargs) len--; @@ -473,9 +475,10 @@ public class GCCBuiltinSymbolProvider implements IBuiltinBindingsProvider { IType rt = toType(returnType); IFunctionType ft = fCpp ? new CPPFunctionType(rt, pTypes) : new CFunctionType(rt, pTypes); - IBinding b = fCpp ? new CPPImplicitFunction(toCharArray(name), fScope, - (ICPPFunctionType) ft, (ICPPParameter[]) theParms, varargs) - : new CImplicitFunction(toCharArray(name), fScope, ft, theParms, varargs); + IBinding b = fCpp ? + new CPPImplicitFunction(toCharArray(name), fScope, (ICPPFunctionType) ft, + (ICPPParameter[]) theParms, varargs) : + new CImplicitFunction(toCharArray(name), fScope, ft, theParms, varargs); fBindingList.add(b); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java index aa7f1f8f34e..1dedd160d19 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java @@ -37,6 +37,7 @@ import org.eclipse.cdt.core.parser.util.AttributeUtil; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.Linkage; import org.eclipse.cdt.internal.core.dom.parser.ASTQueries; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.core.runtime.PlatformObject; /** @@ -130,6 +131,9 @@ public class CFunction extends PlatformObject implements IFunction, ICInternalFu result[i] = (IParameter) ASTQueries.findInnermostDeclarator(p.getDeclarator()) .getName().resolveBinding(); } + + if (result.length == 1 && SemanticUtil.isVoidType(result[0].getType())) + return IParameter.EMPTY_PARAMETER_ARRAY; } return result; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java index 16b1839d170..288b42a9578 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java @@ -103,6 +103,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.ProblemType; import org.eclipse.cdt.internal.core.dom.parser.SizeofCalculator; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.cdt.internal.core.parser.util.ContentAssistMatcherFactory; /** @@ -1375,6 +1376,9 @@ public class CVisitor extends ASTQueries { for (int i = 0; i < parms.length; i++) { parmTypes[i] = createType(parms[i].getDeclarator()); } + + if (parmTypes.length == 1 && SemanticUtil.isVoidType(parmTypes[0])) + return IType.EMPTY_TYPE_ARRAY; // f(void) is the same as f() return parmTypes; } else if (decltor instanceof ICASTKnRFunctionDeclarator) { IASTName parms[] = ((ICASTKnRFunctionDeclarator) decltor).getParameterNames(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java index 5ede3ec2fa5..3a11bcc11d2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java @@ -15,6 +15,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import static org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter.EMPTY_CPPPARAMETER_ARRAY; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.CVTYPE; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.REF; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.TDEF; @@ -102,7 +103,6 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope { } char[] className = name.getLookupKey(); - ICPPParameter[] voidPs = new ICPPParameter[] { new CPPParameter(CPPSemantics.VOID_TYPE, 0) }; IType pType = new CPPReferenceType(SemanticUtil.constQualify(clsType), false); ICPPParameter[] ps = new ICPPParameter[] { new CPPParameter(pType, 0) }; @@ -111,22 +111,21 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope { implicits= new ICPPMethod[ia.getImplicitsToDeclareCount()]; if (!ia.hasUserDeclaredConstructor()) { - //default constructor: A(void) - ICPPMethod m = new CPPImplicitConstructor(this, className, voidPs); + // Default constructor: A(void) + ICPPMethod m = new CPPImplicitConstructor(this, className, EMPTY_CPPPARAMETER_ARRAY); implicits[i++] = m; addBinding(m); } if (!ia.hasUserDeclaredCopyConstructor()) { - //copy constructor: A(const A &) - + // Copy constructor: A(const A &) ICPPMethod m = new CPPImplicitConstructor(this, className, ps); implicits[i++] = m; addBinding(m); } if (!ia.hasUserDeclaredCopyAssignmentOperator()) { - //copy assignment operator: A& operator = (const A &) + // Copy assignment operator: A& operator = (const A &) IType refType = new CPPReferenceType(clsType, false); ICPPFunctionType ft= CPPVisitor.createImplicitFunctionType(refType, ps, false, false); ICPPMethod m = new CPPImplicitMethod(this, OverloadableOperator.ASSIGN.toCharArray(), ft, ps); @@ -135,10 +134,10 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope { } if (!ia.hasUserDeclaredDestructor()) { - //destructor: ~A() - ICPPFunctionType ft= CPPVisitor.createImplicitFunctionType(new CPPBasicType(Kind.eUnspecified, 0), voidPs, false, false); + // Destructor: ~A() + ICPPFunctionType ft= CPPVisitor.createImplicitFunctionType(new CPPBasicType(Kind.eUnspecified, 0), EMPTY_CPPPARAMETER_ARRAY, false, false); char[] dtorName = CharArrayUtils.concat("~".toCharArray(), className); //$NON-NLS-1$ - ICPPMethod m = new CPPImplicitMethod(this, dtorName, ft, voidPs); + ICPPMethod m = new CPPImplicitMethod(this, dtorName, ft, EMPTY_CPPPARAMETER_ARRAY); implicits[i++] = m; addBinding(m); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java index fef4ac72ad2..5750bfd07cf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java @@ -184,10 +184,13 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt if (binding instanceof ICPPParameter) { result[i]= (ICPPParameter) binding; } else { - result[i] = new CPPParameter.CPPParameterProblem(p, IProblemBinding.SEMANTIC_INVALID_TYPE, - name.toCharArray()); + result[i] = new CPPParameter.CPPParameterProblem(p, + IProblemBinding.SEMANTIC_INVALID_TYPE, name.toCharArray()); } } + + if (result.length == 1 && SemanticUtil.isVoidType(result[0].getType())) + return ICPPParameter.EMPTY_CPPPARAMETER_ARRAY; // f(void) is the same as f() } return result; } @@ -609,10 +612,10 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt final ICPPParameter p = pars[i]; if (p.hasDefaultValue() || p.isParameterPack()) { result--; - } else { - if (pars.length == 1 && SemanticUtil.isVoidType(p.getType())) { - return 0; - } +// } else { +// if (pars.length == 1 && SemanticUtil.isVoidType(p.getType())) { +// return 0; +// } } } return result; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java index 3e44f6fca1f..846cb096615 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java @@ -43,6 +43,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTQueries; import org.eclipse.cdt.internal.core.dom.parser.ProblemFunctionType; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFixed; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; /** * Implementation of function templates @@ -117,6 +118,9 @@ public class CPPFunctionTemplate extends CPPTemplateDefinition IProblemBinding.SEMANTIC_INVALID_TYPE, pname.toCharArray()); } } + + if (result.length == 1 && SemanticUtil.isVoidType(result[0].getType())) + return ICPPParameter.EMPTY_CPPPARAMETER_ARRAY; // f(void) is the same as f() return result; } return CPPBuiltinParameter.createParameterList(getType()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPImplicitConstructor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPImplicitConstructor.java index 98136db3aad..1385172e8b7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPImplicitConstructor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPImplicitConstructor.java @@ -6,8 +6,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Niefer (IBM Corporation) - initial API and implementation - * Markus Schorn (Wind River Systems) + * Andrew Niefer (IBM Corporation) - initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -26,7 +26,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; public class CPPImplicitConstructor extends CPPImplicitMethod implements ICPPConstructor { public CPPImplicitConstructor(ICPPClassScope scope, char[] name, ICPPParameter[] params) { - super( scope, name, createFunctionType(scope, params), params ); + super(scope, name, createFunctionType(scope, params), params); } private static ICPPFunctionType createFunctionType(ICPPClassScope scope, IParameter[] params) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index a4ca20b03e8..de15420e56b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -1837,6 +1837,10 @@ public class CPPVisitor extends ASTQueries { for (int i = 0; i < params.length; i++) { pTypes[i]= createType(params[i], true); } + + if (pTypes.length == 1 && SemanticUtil.isVoidType(pTypes[0])) { + return IType.EMPTY_TYPE_ARRAY; // f(void) is the same as f(). + } return pTypes; }