From cd54f2cfa5b9b06f5fe3885f80ecd3cd73e1b396 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Tue, 26 Apr 2005 21:21:02 +0000 Subject: [PATCH] bug 92791: more problem reporting from C --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 14 +++++++++++++ .../internal/core/dom/parser/c/CVisitor.java | 21 ++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) 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 19ca09a9cdb..bc98e123f0a 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 @@ -3067,4 +3067,18 @@ public class AST2Tests extends AST2BaseTest { assertSame( bs[1], S1 ); assertSame( bs[2], S4 ); } + + public void test92791() throws Exception { + IASTTranslationUnit tu = parse( "int x, y; x * y;", ParserLanguage.C ); //$NON-NLS-1$ + CNameCollector col = new CNameCollector(); + tu.accept( col ); + + assertTrue( col.getName(2).resolveBinding() instanceof IProblemBinding ); + + tu = parse( "void f() { typedef int x; int y; x * y; }", ParserLanguage.C ); //$NON-NLS-1$ + col = new CNameCollector(); + tu.accept( col ); + + assertTrue( col.getName(3).resolveBinding() instanceof IProblemBinding ); + } } \ No newline at end of file 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 cd86052c108..e1f54c9b750 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 @@ -815,14 +815,22 @@ public class CVisitor { } else if( node instanceof IASTIdExpression ){ IASTNode blockItem = getContainingBlockItem( node ); try { - return (IBinding) findBinding( blockItem, ((IASTIdExpression)node).getName(), bits ); + IBinding binding = (IBinding) findBinding( blockItem, ((IASTIdExpression)node).getName(), bits ); + if( binding instanceof IType ){ + return new ProblemBinding( node, IProblemBinding.SEMANTIC_INVALID_TYPE, binding.getNameCharArray() ); + } + return binding; } catch ( DOMException e ) { return null; } } else if( node instanceof ICASTTypedefNameSpecifier ){ IASTNode blockItem = getContainingBlockItem( node ); try { - return (IBinding) findBinding( blockItem, ((ICASTTypedefNameSpecifier)node).getName(), bits ); + IBinding binding = (IBinding) findBinding( blockItem, ((ICASTTypedefNameSpecifier)node).getName(), bits ); + if( binding instanceof IType ) + return binding; + else if( binding != null ) + return new ProblemBinding( node, IProblemBinding.SEMANTIC_INVALID_TYPE, binding.getNameCharArray() ); } catch ( DOMException e ) { return null; } @@ -848,9 +856,16 @@ public class CVisitor { name = ((ICASTElaboratedTypeSpecifier)declSpec).getName(); } else if( declSpec instanceof ICASTCompositeTypeSpecifier ){ name = ((ICASTCompositeTypeSpecifier)declSpec).getName(); + } else if( declSpec instanceof ICASTTypedefNameSpecifier ){ + name = ((ICASTTypedefNameSpecifier)declSpec).getName(); } if( name != null ){ - return name.resolveBinding(); + IBinding binding = name.resolveBinding(); + if( binding instanceof IType ) + return binding; + else if( binding != null ) + return new ProblemBinding( node, IProblemBinding.SEMANTIC_INVALID_TYPE, binding.getNameCharArray() ); + return null; } } else if( node instanceof ICASTFieldDesignator ) { IASTNode blockItem = getContainingBlockItem( node );