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 141f6111c4f..19e496add9f 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 @@ -4765,4 +4765,34 @@ public class AST2Tests extends AST2BaseTest { parseAndCheckBindings(code, ParserLanguage.C, true); parseAndCheckBindings(code, ParserLanguage.CPP, true); } + + // typedef void VOID; + // VOID func(VOID) { + // } + public void testTypedefVoid_Bug221567() throws Exception { + final boolean[] isCpps= {false, true}; + String code= getAboveComment(); + for (boolean isCpp : isCpps) { + BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), isCpp); + 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]; + 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()); + } + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java index 3e02d134f03..af6e7ab22fb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java @@ -2208,7 +2208,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { // if the next token is a tSEMI then the declaration was a regular // declaration statement i.e. int f(type_def); - if (LT(1) == IToken.tSEMI) { + final int lt1= LT(1); + if (lt1 == IToken.tSEMI || lt1 == IToken.tLBRACE) { backup(mark); return 0; }