From cb647d08f060ec2509276c2e1705f2ed94d8dc87 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 28 Sep 2009 13:24:16 +0000 Subject: [PATCH] Owner of forward class declarations, bug 290693. --- .../core/parser/tests/ast2/AST2CPPTests.java | 22 +++++++++++++++++++ .../dom/parser/cpp/semantics/CPPVisitor.java | 20 +++++++++++++---- 2 files changed, 38 insertions(+), 4 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 30fbeb068b3..b052acba455 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 @@ -7411,4 +7411,26 @@ public class AST2CPPTests extends AST2BaseTest { assertEquals(declNames.length, i); assertEquals(defNames.length, j); } + + // class X { + // struct S* m1; + // struct T; + // struct T* m2; + // }; + public void testStructOwner_290693() throws Exception { + final String code = getAboveComment(); + parseAndCheckBindings(code, ParserLanguage.CPP); + + BindingAssertionHelper bh= new BindingAssertionHelper(code, true); + ICPPClassType S= bh.assertNonProblem("S*", 1); + assertNull(S.getOwner()); + + ICPPClassType X= bh.assertNonProblem("X {", 1); + ICPPClassType T= bh.assertNonProblem("T;", 1); + assertSame(X, T.getOwner()); + + T= bh.assertNonProblem("T* m2", 1); + assertSame(X, T.getOwner()); + } } + 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 2d9524ec47a..edd717e1e91 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 @@ -2023,18 +2023,30 @@ public class CPPVisitor extends ASTQueries { */ public static IBinding findDeclarationOwner(IASTNode node, boolean allowFunction) { // Search for declaration + boolean isFriend= false; + boolean isNonSimpleElabDecl= false; while (!(node instanceof IASTDeclaration)) { if (node == null) return null; + if (node instanceof IASTElaboratedTypeSpecifier) { + isNonSimpleElabDecl= true; + final IASTNode parent= node.getParent(); + if (parent instanceof IASTSimpleDeclaration) { + final IASTSimpleDeclaration sdecl = (IASTSimpleDeclaration) parent; + if (sdecl.getDeclarators().length==0) { + isNonSimpleElabDecl= false; + } + } + } node= node.getParent(); } - boolean isFriend= false; if (node instanceof IASTSimpleDeclaration) { - ICPPASTDeclSpecifier declSpec= (ICPPASTDeclSpecifier) ((IASTSimpleDeclaration) node).getDeclSpecifier(); + final IASTSimpleDeclaration sdecl = (IASTSimpleDeclaration) node; + ICPPASTDeclSpecifier declSpec= (ICPPASTDeclSpecifier) sdecl.getDeclSpecifier(); if (declSpec.isFriend()) { isFriend= true; - } + } } else if (node instanceof IASTFunctionDefinition) { IASTFunctionDefinition funcDefinition = (IASTFunctionDefinition) node; ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) funcDefinition.getDeclSpecifier(); @@ -2058,7 +2070,7 @@ public class CPPVisitor extends ASTQueries { break; } if (node instanceof IASTCompositeTypeSpecifier) { - if (isFriend) + if (isFriend || isNonSimpleElabDecl) continue; name= ((IASTCompositeTypeSpecifier) node).getName(); break;