1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

NPE for illegal friend declarations on global scope, bug 292174.

This commit is contained in:
Markus Schorn 2009-10-14 11:22:27 +00:00
parent 241e84b54e
commit 0cfed67288

View file

@ -891,22 +891,26 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
ICPPASTElaboratedTypeSpecifier elaboratedSpecifier = (ICPPASTElaboratedTypeSpecifier)parentNode; ICPPASTElaboratedTypeSpecifier elaboratedSpecifier = (ICPPASTElaboratedTypeSpecifier)parentNode;
if (elaboratedSpecifier.isFriend()) { if (elaboratedSpecifier.isFriend()) {
pdomName.setIsFriendSpecifier(true); pdomName.setIsFriendSpecifier(true);
PDOMName enclClassName= (PDOMName) pdomName.getEnclosingDefinition(); PDOMName enclClassName = (PDOMName) pdomName.getEnclosingDefinition();
PDOMBinding enclClassBinding= enclClassName.getBinding(); if (enclClassName != null) {
PDOMBinding enclClassBinding = enclClassName.getBinding();
if (enclClassBinding instanceof PDOMCPPClassType) { if (enclClassBinding instanceof PDOMCPPClassType) {
((PDOMCPPClassType)enclClassBinding).addFriend(new PDOMCPPFriend(this, pdomName)); ((PDOMCPPClassType) enclClassBinding).addFriend(new PDOMCPPFriend(this, pdomName));
}
} }
} }
} else if (parentNode instanceof ICPPASTFunctionDeclarator) { } else if (parentNode instanceof ICPPASTFunctionDeclarator) {
if (parentNode.getParent() instanceof IASTSimpleDeclaration) { if (parentNode.getParent() instanceof IASTSimpleDeclaration) {
IASTSimpleDeclaration grandparentNode = (IASTSimpleDeclaration) parentNode.getParent(); IASTSimpleDeclaration grandparentNode = (IASTSimpleDeclaration) parentNode.getParent();
if (grandparentNode.getDeclSpecifier() instanceof ICPPASTDeclSpecifier) { if (grandparentNode.getDeclSpecifier() instanceof ICPPASTDeclSpecifier) {
if (((ICPPASTDeclSpecifier)grandparentNode.getDeclSpecifier()).isFriend()) { if (((ICPPASTDeclSpecifier) grandparentNode.getDeclSpecifier()).isFriend()) {
pdomName.setIsFriendSpecifier(true); pdomName.setIsFriendSpecifier(true);
PDOMName enclClassName= (PDOMName) pdomName.getEnclosingDefinition(); PDOMName enclClassName = (PDOMName) pdomName.getEnclosingDefinition();
PDOMBinding enclClassBinding= enclClassName.getBinding(); if (enclClassName != null) {
PDOMBinding enclClassBinding = enclClassName.getBinding();
if (enclClassBinding instanceof PDOMCPPClassType) { if (enclClassBinding instanceof PDOMCPPClassType) {
((PDOMCPPClassType)enclClassBinding).addFriend(new PDOMCPPFriend(this, pdomName)); ((PDOMCPPClassType) enclClassBinding).addFriend(new PDOMCPPFriend(this, pdomName));
}
} }
} }
} }
@ -951,14 +955,16 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
} }
} }
if (pdomName.isFriendSpecifier()) { if (pdomName.isFriendSpecifier()) {
PDOMName enclClassName= (PDOMName) pdomName.getEnclosingDefinition(); PDOMName enclClassName = (PDOMName) pdomName.getEnclosingDefinition();
PDOMBinding enclClassBinding= enclClassName.getBinding(); if (enclClassName != null) {
PDOMBinding enclClassBinding = enclClassName.getBinding();
if (enclClassBinding instanceof PDOMCPPClassType) { if (enclClassBinding instanceof PDOMCPPClassType) {
PDOMCPPClassType ownerClass = (PDOMCPPClassType)enclClassBinding; PDOMCPPClassType ownerClass = (PDOMCPPClassType) enclClassBinding;
ownerClass.removeFriend(pdomName); ownerClass.removeFriend(pdomName);
} }
} }
} }
}
@Override @Override
protected PDOMFile getLocalToFile(IBinding binding, PDOMBinding glob) throws CoreException { protected PDOMFile getLocalToFile(IBinding binding, PDOMBinding glob) throws CoreException {