1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Patch for 162581, by Andrew Ferguson, stack overflow in AST/PDOM.

This commit is contained in:
Markus Schorn 2006-11-08 09:42:22 +00:00
parent 4c73232e1c
commit e6a0b48500
4 changed files with 137 additions and 4 deletions

View file

@ -75,7 +75,7 @@ public class OverloadsWithinCommonHeaderTests extends PDOMTestBase {
public void testOverloadedInCommonHeader_FileScope() throws CoreException {
Pattern[] QuuxPath = makePatternArray(new String[] {"quux"});
IBinding[] Quux = pdom.findBindings(QuuxPath, false, IndexFilter.getFilter(Linkage.CPP_LINKAGE), new NullProgressMonitor());
IBinding[] Quux = pdom.findBindings(QuuxPath, true, IndexFilter.getFilter(Linkage.CPP_LINKAGE), new NullProgressMonitor());
assertEquals(5,Quux.length);
@ -112,10 +112,31 @@ public class OverloadsWithinCommonHeaderTests extends PDOMTestBase {
// corge::grault(ManyOverloaded*)
assertFunctionRefCount(new Class[] {IPointerType.class}, Grault, 12);
// (corge::grault(ManyOverloaded)
// corge::grault(ManyOverloaded)
assertFunctionRefCount(new Class[] {ICPPClassType.class}, Grault, 14);
}
public void testOverloadedInCommonHeader_NamespaceScope_Collides_With_Filescope() throws CoreException {
Pattern[] ns2Path = makePatternArray(new String[] {"ns2","quux"});
IBinding[] ns2 = pdom.findBindings(ns2Path, true, IndexFilter.getFilter(Linkage.CPP_LINKAGE), new NullProgressMonitor());
assertEquals(5,ns2.length);
// ns2::quux()
assertFunctionRefCount(new Class[0], ns2, 16);
// ns2::quux(int,char)
assertFunctionRefCount(new Class[] {IBasicType.class}, ns2, 20);
// ns2::quux(int,char)
assertFunctionRefCount(new Class[] {IBasicType.class, IBasicType.class}, ns2, 24);
// ns2::quux(ManyOverloaded*)
assertFunctionRefCount(new Class[] {IPointerType.class}, ns2, 28);
// ns2::quux(ManyOverloaded)
assertFunctionRefCount(new Class[] {ICPPClassType.class}, ns2, 32);
}
protected void assertFunctionRefCount(Class[] args, IBinding[] bindingPool, int refCount) throws CoreException {
assertFunctionRefCount(pdom, args, bindingPool, refCount);
}

View file

@ -0,0 +1,30 @@
class ManyOverloaded {
public:
void qux();
void qux(int i);
void qux(int i, char c);
void qux(ManyOverloaded* ptr);
void qux(ManyOverloaded nptr);
};
void quux();
void quux(int i);
void quux(int i, char c);
void quux(ManyOverloaded* ptr);
void quux(ManyOverloaded nptr);
namespace corge {
void grault();
void grault(int i);
void grault(int i, char c);
void grault(ManyOverloaded* ptr);
void grault(ManyOverloaded nptr);
}
namespace ns2 {
void quux();
void quux(int i);
void quux(int i, char c);
void quux(ManyOverloaded* ptr);
void quux(ManyOverloaded nptr);
}

View file

@ -1,4 +1,19 @@
#include "class.h"
#include "common.h"
namespace corge {
void referencesA_inNS() {
ManyOverloaded m;
ns2::quux(); ns2::quux(); ns2::quux(); ns2::quux();
ns2::quux(5); ns2::quux(5); ns2::quux(5); ns2::quux(5); ns2::quux(5);
ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f');
ns2::quux(new ManyOverloaded()); ns2::quux(new ManyOverloaded());
ns2::quux(new ManyOverloaded()); ns2::quux(new ManyOverloaded());
ns2::quux(new ManyOverloaded()); ns2::quux(new ManyOverloaded());
ns2::quux(new ManyOverloaded());
ns2::quux(m); ns2::quux(m); ns2::quux(m); ns2::quux(m); ns2::quux(m);
ns2::quux(m); ns2::quux(m); ns2::quux(m);
}
}
void referencesA() {
ManyOverloaded m;
@ -24,4 +39,30 @@ void referencesA() {
corge::grault(new ManyOverloaded()); corge::grault(new ManyOverloaded());
corge::grault(m); corge::grault(m); corge::grault(m); corge::grault(m); corge::grault(m);
corge::grault(m); corge::grault(m);
ns2::quux(); ns2::quux(); ns2::quux(); ns2::quux();
ns2::quux(5); ns2::quux(5); ns2::quux(5); ns2::quux(5); ns2::quux(5);
ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f');
ns2::quux(new ManyOverloaded()); ns2::quux(new ManyOverloaded());
ns2::quux(new ManyOverloaded()); ns2::quux(new ManyOverloaded());
ns2::quux(new ManyOverloaded()); ns2::quux(new ManyOverloaded());
ns2::quux(new ManyOverloaded());
ns2::quux(m); ns2::quux(m); ns2::quux(m); ns2::quux(m); ns2::quux(m);
ns2::quux(m); ns2::quux(m); ns2::quux(m);
m.qux(UNRESOLVED_SYMBOL); // indexer should skip without error
m.qux(4, UNRESOLVED_SYMBOL); // indexer should skip without error
quux(UNRESOLVED_SYMBOL); // indexer should skip without error
quux(6, UNRESOLVED_SYMBOL); // indexer should skip without error
corge::grault(UNRESOLVED_SYMBOL); // indexer should skip without error
corge::grault(6, UNRESOLVED_SYMBOL); // indexer should skip without error
ns2::quux(UNRESOLVED_SYMBOL); // indexer should skip without error
ns2::quux(4, UNRESOLVED_SYMBOL); // indexer should skip without error
}
namespace corge {
void problemRefsA() {
ns2::quux(UNRESOLVED_SYMBOL); // indexer should skip without error
ns2::quux(4, UNRESOLVED_SYMBOL); // indexer should skip without error
}
}

View file

@ -1,4 +1,19 @@
#include "class.h"
#include "common.h"
namespace corge {
void referencesB_inNS() {
ManyOverloaded m;
ns2::quux(); ns2::quux(); ns2::quux(); ns2::quux();
ns2::quux(5); ns2::quux(5); ns2::quux(5); ns2::quux(5); ns2::quux(5);
ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f');
ns2::quux(new ManyOverloaded()); ns2::quux(new ManyOverloaded());
ns2::quux(new ManyOverloaded()); ns2::quux(new ManyOverloaded());
ns2::quux(new ManyOverloaded()); ns2::quux(new ManyOverloaded());
ns2::quux(new ManyOverloaded());
ns2::quux(m); ns2::quux(m); ns2::quux(m); ns2::quux(m); ns2::quux(m);
ns2::quux(m); ns2::quux(m); ns2::quux(m);
}
}
void referencesB() {
ManyOverloaded m;
@ -24,4 +39,30 @@ void referencesB() {
corge::grault(new ManyOverloaded()); corge::grault(new ManyOverloaded());
corge::grault(m); corge::grault(m); corge::grault(m); corge::grault(m); corge::grault(m);
corge::grault(m); corge::grault(m);
ns2::quux(); ns2::quux(); ns2::quux(); ns2::quux();
ns2::quux(5); ns2::quux(5); ns2::quux(5); ns2::quux(5); ns2::quux(5);
ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f'); ns2::quux(6,'f');
ns2::quux(new ManyOverloaded()); ns2::quux(new ManyOverloaded());
ns2::quux(new ManyOverloaded()); ns2::quux(new ManyOverloaded());
ns2::quux(new ManyOverloaded()); ns2::quux(new ManyOverloaded());
ns2::quux(new ManyOverloaded());
ns2::quux(m); ns2::quux(m); ns2::quux(m); ns2::quux(m); ns2::quux(m);
ns2::quux(m); ns2::quux(m); ns2::quux(m);
m.qux(UNRESOLVED_SYMBOL); // indexer should skip without error
m.qux(4, UNRESOLVED_SYMBOL); // indexer should skip without error
quux(UNRESOLVED_SYMBOL); // indexer should skip without error
quux(6, UNRESOLVED_SYMBOL); // indexer should skip without error
corge::grault(UNRESOLVED_SYMBOL); // indexer should skip without error
corge::grault(6, UNRESOLVED_SYMBOL); // indexer should skip without error
ns2::quux(UNRESOLVED_SYMBOL); // indexer should skip without error
ns2::quux(4, UNRESOLVED_SYMBOL); // indexer should skip without error
}
namespace corge {
void problemRefsB() {
ns2::quux(UNRESOLVED_SYMBOL); // indexer should skip without error
ns2::quux(4, UNRESOLVED_SYMBOL); // indexer should skip without error
}
}