mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-23 17:05:26 +02:00
Inline friend functions, bug 284690.
This commit is contained in:
parent
b3c11fe78f
commit
03df93edb2
3 changed files with 24 additions and 23 deletions
|
@ -7336,4 +7336,14 @@ public class AST2CPPTests extends AST2BaseTest {
|
|||
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
|
||||
ba.assertProblem("enum_name", 9);
|
||||
}
|
||||
|
||||
// class CL {
|
||||
// typedef int x;
|
||||
// friend void test() {
|
||||
// x a; // problem on x
|
||||
// }
|
||||
// };
|
||||
public void testLookupFromInlineFriend_284690() throws Exception {
|
||||
parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1288,9 +1288,8 @@ public class CPPSemantics {
|
|||
IASTDeclarator[] declarators = simpleDeclaration.getDeclarators();
|
||||
IScope dtorScope= scope;
|
||||
if (declSpec.isFriend()) {
|
||||
// Friends are added to an enclosing scope. They have to be added such that they are
|
||||
// picked up when this scope is re-populated during ambiguity resolution, while the
|
||||
// enclosing scope is left as it is.
|
||||
// Friends are added to an enclosing scope. Here we have to do that, because when this scope is re-populated
|
||||
// during ambiguity resolution, the enclosing scope is otherwise left as it is (without the friend).
|
||||
try {
|
||||
while (dtorScope != null && dtorScope.getKind() == EScopeKind.eClassType)
|
||||
dtorScope= dtorScope.getParent();
|
||||
|
|
|
@ -578,10 +578,15 @@ public class CPPVisitor extends ASTQueries {
|
|||
boolean isFriendDecl= false;
|
||||
ICPPScope scope = (ICPPScope) getContainingNonTemplateScope(name);
|
||||
try {
|
||||
if (parent instanceof IASTSimpleDeclaration && scope instanceof ICPPClassScope) {
|
||||
ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) ((IASTSimpleDeclaration) parent).getDeclSpecifier();
|
||||
if (declSpec.isFriend()) {
|
||||
isFriendDecl= true;
|
||||
if (scope instanceof ICPPClassScope) {
|
||||
if (parent instanceof IASTSimpleDeclaration) {
|
||||
ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) ((IASTSimpleDeclaration) parent).getDeclSpecifier();
|
||||
isFriendDecl= declSpec.isFriend();
|
||||
} else if (parent instanceof IASTFunctionDefinition) {
|
||||
ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) ((IASTFunctionDefinition) parent).getDeclSpecifier();
|
||||
isFriendDecl= declSpec.isFriend();
|
||||
}
|
||||
if (isFriendDecl) {
|
||||
try {
|
||||
while (scope.getKind() == EScopeKind.eClassType) {
|
||||
scope = (ICPPScope) getParentScope(scope, name.getTranslationUnit());
|
||||
|
@ -769,10 +774,6 @@ public class CPPVisitor extends ASTQueries {
|
|||
} else if (parent instanceof IASTForStatement) {
|
||||
return ((IASTForStatement) parent).getScope();
|
||||
} else if (parent instanceof IASTCompositeTypeSpecifier) {
|
||||
if (node instanceof IASTFunctionDefinition &&
|
||||
((ICPPASTDeclSpecifier) ((IASTFunctionDefinition) node).getDeclSpecifier()).isFriend()) {
|
||||
return getContainingScope(parent);
|
||||
}
|
||||
return ((IASTCompositeTypeSpecifier) parent).getScope();
|
||||
} else if (parent instanceof ICPPASTNamespaceDefinition) {
|
||||
return ((ICPPASTNamespaceDefinition) parent).getScope();
|
||||
|
@ -806,19 +807,10 @@ public class CPPVisitor extends ASTQueries {
|
|||
while (parent.getParent() instanceof IASTDeclarator)
|
||||
parent = parent.getParent();
|
||||
ASTNodeProperty prop = parent.getPropertyInParent();
|
||||
if (prop == IASTSimpleDeclaration.DECLARATOR) {
|
||||
if (prop == IASTSimpleDeclaration.DECLARATOR)
|
||||
return dtor.getFunctionScope();
|
||||
} else if (prop == IASTFunctionDefinition.DECLARATOR) {
|
||||
IASTFunctionDefinition funcDef = (IASTFunctionDefinition) parent.getParent();
|
||||
ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) funcDef.getDeclSpecifier();
|
||||
if (declSpec.isFriend()) {
|
||||
parent = funcDef.getParent();
|
||||
if (parent instanceof IASTCompositeTypeSpecifier) {
|
||||
return ((IASTCompositeTypeSpecifier) parent).getScope();
|
||||
}
|
||||
}
|
||||
return ((IASTCompoundStatement) funcDef.getBody()).getScope();
|
||||
}
|
||||
else if (prop == IASTFunctionDefinition.DECLARATOR)
|
||||
return ((IASTCompoundStatement) ((IASTFunctionDefinition) parent.getParent()).getBody()).getScope();
|
||||
}
|
||||
} else if (parent instanceof ICPPASTTemplateDeclaration) {
|
||||
return CPPTemplates.getContainingScope(node);
|
||||
|
|
Loading…
Add table
Reference in a new issue