From d74ee1a89c6d3713c0244f1f1dff2b8dc56525d2 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Tue, 15 Dec 2015 19:49:29 -0500 Subject: [PATCH] Bug 484162 - Instantiation of friend of nested class inside template Change-Id: I28377e20ce63c3e22ea561a98773e73484edf09a Signed-off-by: Nathan Ridge --- .../parser/tests/ast2/AST2TemplateTests.java | 21 +++++++++++++++++++ .../parser/cpp/semantics/CPPSemantics.java | 12 ++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 18b0134f4f2..d84352d70e1 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -8691,6 +8691,27 @@ public class AST2TemplateTests extends AST2TestBase { public void testStrayFriends_419301() throws Exception { parseAndCheckBindings(); } + + // template + // struct A { + // struct B { + // friend B foo(B, long); + // friend long foo(B, B); + // }; + // }; + // + // template + // void waldo(T); + // + // A::B c; + // A::B d; + // + // void test() { + // waldo(foo(c, d)); // problem on waldo + // } + public void testInstantiationOfFriendOfNestedClassInsideTemplate_484162() throws Exception { + parseAndCheckBindings(); + } // template // constexpr T t(T) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index cafd6a20aa9..5f0671b26b9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -805,16 +805,18 @@ public class CPPSemantics { // * ... types of the template arguments for template type parameters // (excluding template template parameters); // * ... owners of which any template template arguments are members; - if (ct instanceof ICPPTemplateInstance) { + if (ct instanceof ICPPSpecialization) { for (IBinding friend : ClassTypeHelper.getFriends(ct, tu)) { if (friend instanceof ICPPFunction) { friendFns.add((ICPPFunction) friend); } } - ICPPTemplateArgument[] args = ((ICPPTemplateInstance) ct).getTemplateArguments(); - for (ICPPTemplateArgument arg : args) { - if (arg.isTypeValue()) { - getAssociatedScopes(arg.getTypeValue(), namespaces, friendFns, handled, tu); + if (ct instanceof ICPPTemplateInstance) { + ICPPTemplateArgument[] args = ((ICPPTemplateInstance) ct).getTemplateArguments(); + for (ICPPTemplateArgument arg : args) { + if (arg.isTypeValue()) { + getAssociatedScopes(arg.getTypeValue(), namespaces, friendFns, handled, tu); + } } } }