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 37e817e0de6..a15414a8d23 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 @@ -9321,10 +9321,10 @@ public class AST2CPPTests extends AST2TestBase { // } public void testOwner() throws Exception { BindingAssertionHelper bh = getAssertionHelper(); - ICPPBinding ns = bh.assertNonProblemOnFirstIdentifier("ns"); - ICPPBinding A = bh.assertNonProblemOnFirstIdentifier("A"); + ICPPNamespace ns = bh.assertNonProblemOnFirstIdentifier("ns"); + ICPPClassType A = bh.assertNonProblemOnFirstIdentifier("A"); assertEquals(ns, A.getOwner()); - IBinding m = bh.assertNonProblemOnFirstIdentifier("m()"); + ICPPMethod m = bh.assertNonProblemOnFirstIdentifier("m()"); assertEquals(A, m.getOwner()); assertEquals(A, bh.assertNonProblemOnFirstIdentifier("x;").getOwner()); assertEquals(A, bh.assertNonProblemOnFirstIdentifier("y;").getOwner()); 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 741b451831d..484035bb24d 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 @@ -4136,6 +4136,26 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(getAboveComment()); } + // template + // struct A { + // template + // friend void f(const A& p) {} + // template + // void m(const A& p) const; + // }; + // + // void test(const A& a) { + // f(a); + // a.m(a); + // } + public void testOwnerOfFriendTemplateFunction_408181() throws Exception { + BindingAssertionHelper bh = getAssertionHelper(); + ICPPFunction f = bh.assertNonProblemOnFirstIdentifier("f(a)"); + assertNull(f.getOwner()); + ICPPClassType A = bh.assertNonProblem("A"); + assertEquals(A, bh.assertNonProblemOnFirstIdentifier("m(a);").getOwner()); + } + // template void f(T t) { // g(t); // } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index b4921e3746a..0fccd2ed7c8 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -1369,7 +1369,19 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa final IType type = t2.getType(); assertTrue(type instanceof IBasicType); - assertEquals(((IBasicType)type).getType(), IBasicType.t_int); + assertEquals(((IBasicType) type).getType(), IBasicType.t_int); + } + + // struct A { + // template + // struct S; + // }; + // template + // struct A::S {}; + + // A::S a; + public void testXXX() throws Exception { + checkBindings(); } // template diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java index 38784c567ed..ea247e46d9a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java @@ -14,7 +14,6 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; @@ -31,7 +30,7 @@ public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization implements ICPPFunctionTemplate, ICPPInternalTemplate { private ObjectMap instances; - public CPPFunctionTemplateSpecialization(ICPPFunction original, ICPPClassType owner, + public CPPFunctionTemplateSpecialization(ICPPFunction original, IBinding owner, ICPPTemplateParameterMap argumentMap, ICPPFunctionType type, IType[] exceptionSpecs) { super(original, owner, argumentMap, type, exceptionSpecs); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index 29ab1ac1b4c..bf88ee2238c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -839,7 +839,8 @@ public class CPPTemplates { } else if (decl instanceof ICPPMethod) { spec = new CPPMethodTemplateSpecialization((ICPPMethod) decl, owner, tpMap, type, exceptionSpecs); } else { - spec = new CPPFunctionTemplateSpecialization((ICPPFunctionTemplate) decl, owner, tpMap, type, exceptionSpecs); + IBinding oldOwner = decl.getOwner(); + spec = new CPPFunctionTemplateSpecialization((ICPPFunctionTemplate) decl, oldOwner, tpMap, type, exceptionSpecs); } } else if (decl instanceof ICPPConstructor) { spec = new CPPConstructorSpecialization((ICPPConstructor) decl, owner, tpMap, type, exceptionSpecs);