mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-11 02:05:39 +02:00
Bug 316317: [C++ 0x] Local and unnamed types as template arguments.
This commit is contained in:
parent
4adeb3cefb
commit
17241dc891
2 changed files with 54 additions and 9 deletions
|
@ -5057,4 +5057,41 @@ public class AST2TemplateTests extends AST2BaseTest {
|
||||||
assertSame(ft, inst.getTemplateDefinition());
|
assertSame(ft, inst.getTemplateDefinition());
|
||||||
assertSame(M, inst.getOwner());
|
assertSame(M, inst.getOwner());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// template <class T> struct A {
|
||||||
|
// friend void f(A, T){}
|
||||||
|
// };
|
||||||
|
// template <class T> void g(T t) {
|
||||||
|
// A<T> at;
|
||||||
|
// f(at, t);
|
||||||
|
// }
|
||||||
|
// int main() {
|
||||||
|
// class X {} x;
|
||||||
|
// g(x);
|
||||||
|
// }
|
||||||
|
public void testUnnamedTypesAsTemplateArgument_316317a() throws Exception {
|
||||||
|
final String code= getAboveComment();
|
||||||
|
parseAndCheckBindings(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
// template <class T> class X { };
|
||||||
|
// template <class T> void f(T t) { }
|
||||||
|
// struct {} unnamed_obj;
|
||||||
|
// void f() {
|
||||||
|
// struct A { };
|
||||||
|
// enum { e1 };
|
||||||
|
// typedef struct {} B;
|
||||||
|
// B b;
|
||||||
|
// X<A> x1; // OK
|
||||||
|
// X<A*> x2; // OK
|
||||||
|
// X<B> x3; // OK
|
||||||
|
// f(e1); // OK
|
||||||
|
// f(unnamed_obj); // OK
|
||||||
|
// f(b); // OK
|
||||||
|
// }
|
||||||
|
public void testUnnamedTypesAsTemplateArgument_316317b() throws Exception {
|
||||||
|
final String code= getAboveComment();
|
||||||
|
parseAndCheckBindings(code);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ import org.eclipse.cdt.core.dom.ILinkage;
|
||||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||||
import org.eclipse.cdt.core.index.IIndex;
|
import org.eclipse.cdt.core.index.IIndex;
|
||||||
import org.eclipse.cdt.core.index.IIndexBinding;
|
import org.eclipse.cdt.core.index.IIndexBinding;
|
||||||
import org.eclipse.cdt.core.index.IIndexName;
|
import org.eclipse.cdt.core.index.IIndexName;
|
||||||
|
@ -129,15 +130,22 @@ public class CHQueries {
|
||||||
for (IIndexName name : refs) {
|
for (IIndexName name : refs) {
|
||||||
IBinding binding= index.findBinding(name);
|
IBinding binding= index.findBinding(name);
|
||||||
if (CallHierarchyUI.isRelevantForCallHierarchy(binding)) {
|
if (CallHierarchyUI.isRelevantForCallHierarchy(binding)) {
|
||||||
ICElement[] defs= null;
|
for(;;) {
|
||||||
if (binding instanceof ICPPMethod) {
|
ICElement[] defs= null;
|
||||||
defs = findOverriders(index, (ICPPMethod) binding);
|
if (binding instanceof ICPPMethod) {
|
||||||
}
|
defs = findOverriders(index, (ICPPMethod) binding);
|
||||||
if (defs == null) {
|
}
|
||||||
defs= IndexUI.findRepresentative(index, binding);
|
if (defs == null) {
|
||||||
}
|
defs= IndexUI.findRepresentative(index, binding);
|
||||||
if (defs != null && defs.length > 0) {
|
}
|
||||||
result.add(defs, name);
|
if (defs != null && defs.length > 0) {
|
||||||
|
result.add(defs, name);
|
||||||
|
} else if (binding instanceof ICPPSpecialization) {
|
||||||
|
binding= ((ICPPSpecialization) binding).getSpecializedBinding();
|
||||||
|
if (binding != null)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue