1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-05 08:05:24 +02:00

Bug 484162 - Instantiation of friend of nested class inside template

Change-Id: I28377e20ce63c3e22ea561a98773e73484edf09a
Signed-off-by: Nathan Ridge <zeratul976@hotmail.com>
This commit is contained in:
Nathan Ridge 2015-12-15 19:49:29 -05:00 committed by Sergey Prigogin
parent 6a9dccd2b0
commit d74ee1a89c
2 changed files with 28 additions and 5 deletions

View file

@ -8691,6 +8691,27 @@ public class AST2TemplateTests extends AST2TestBase {
public void testStrayFriends_419301() throws Exception {
parseAndCheckBindings();
}
// template <typename>
// struct A {
// struct B {
// friend B foo(B, long);
// friend long foo(B, B);
// };
// };
//
// template <typename T>
// void waldo(T);
//
// A<int>::B c;
// A<int>::B d;
//
// void test() {
// waldo(foo(c, d)); // problem on waldo
// }
public void testInstantiationOfFriendOfNestedClassInsideTemplate_484162() throws Exception {
parseAndCheckBindings();
}
// template <typename T>
// constexpr T t(T) {

View file

@ -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);
}
}
}
}