From 47a3b8193f238ab7c6f282171f9aa26c82d7a343 Mon Sep 17 00:00:00 2001 From: Jerome St-Louis Date: Thu, 3 Jul 2014 04:29:13 -0400 Subject: [PATCH] compiler/libec: Fixed warnings on setting LinkList::first = null - Tweaked last commit check for destination type 'thisClassFrom' --- compiler/bootstrap/ecere/bootstrap/AVLTree.c | 4 ++-- compiler/bootstrap/ecere/bootstrap/List.c | 4 ++-- compiler/bootstrap/ecere/bootstrap/Map.c | 6 +++--- compiler/bootstrap/libec/bootstrap/ecdefs.c | 2 +- compiler/bootstrap/libec/bootstrap/freeAst.c | 4 ++-- compiler/bootstrap/libec/bootstrap/pass0.c | 4 ++-- compiler/bootstrap/libec/bootstrap/pass15.c | 10 +++++++++- compiler/bootstrap/libec/bootstrap/pass16.c | 6 +++--- compiler/bootstrap/libec/bootstrap/pass3.c | 14 ++++++-------- compiler/libec/src/pass15.ec | 13 ++++++++++++- compiler/libec/src/pass3.ec | 2 -- 11 files changed, 42 insertions(+), 27 deletions(-) diff --git a/compiler/bootstrap/ecere/bootstrap/AVLTree.c b/compiler/bootstrap/ecere/bootstrap/AVLTree.c index 803fc99..6839d5d 100644 --- a/compiler/bootstrap/ecere/bootstrap/AVLTree.c +++ b/compiler/bootstrap/ecere/bootstrap/AVLTree.c @@ -409,14 +409,14 @@ return 0; struct __ecereNameSpace__ecere__com__AVLNode * __ecereMethod___ecereNameSpace__ecere__com__AVLTree_Find(struct __ecereNameSpace__ecere__com__Instance * this, const uint64 key) { -struct __ecereNameSpace__ecere__com__AVLNode * root = ((struct __ecereNameSpace__ecere__com__AVLNode *)(uintptr_t)((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root); +struct __ecereNameSpace__ecere__com__AVLNode * root = ((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root; return root ? __ecereMethod___ecereNameSpace__ecere__com__AVLNode_Find(root, ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[5].__anon1.__anon1.dataTypeClass, key) : (((void *)0)); } struct __ecereNameSpace__ecere__com__AVLNode * __ecereMethod___ecereNameSpace__ecere__com__AVLTree_FindAll(struct __ecereNameSpace__ecere__com__Instance * this, const uint64 key) { -struct __ecereNameSpace__ecere__com__AVLNode * root = ((struct __ecereNameSpace__ecere__com__AVLNode *)(uintptr_t)((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root); +struct __ecereNameSpace__ecere__com__AVLNode * root = ((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root; return root ? __ecereMethod___ecereNameSpace__ecere__com__AVLNode_FindAll(root, key) : (((void *)0)); } diff --git a/compiler/bootstrap/ecere/bootstrap/List.c b/compiler/bootstrap/ecere/bootstrap/List.c index db9f2f8..ede81cf 100644 --- a/compiler/bootstrap/ecere/bootstrap/List.c +++ b/compiler/bootstrap/ecere/bootstrap/List.c @@ -462,14 +462,14 @@ return (struct __ecereNameSpace__ecere__com__Link *)((struct __ecereNameSpace__e struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = this; __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__List->_vTbl; -})[__ecereVMethodID___ecereNameSpace__ecere__com__Container_Insert])(this, (void *)(((struct __ecereNameSpace__ecere__com__Link *)(uintptr_t)((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->last)), value); +})[__ecereVMethodID___ecereNameSpace__ecere__com__Container_Insert])(this, (void *)(((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->last), value); } void __ecereMethod___ecereNameSpace__ecere__com__List_Free(struct __ecereNameSpace__ecere__com__Instance * this) { void * item; -while((item = ((struct __ecereNameSpace__ecere__com__Link *)((uintptr_t)(((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first))))) +while((item = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first)) { uint64 data = ((uint64 (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * pointer))__extension__ ({ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = this; diff --git a/compiler/bootstrap/ecere/bootstrap/Map.c b/compiler/bootstrap/ecere/bootstrap/Map.c index dbe1e68..5092ff5 100644 --- a/compiler/bootstrap/ecere/bootstrap/Map.c +++ b/compiler/bootstrap/ecere/bootstrap/Map.c @@ -656,7 +656,7 @@ void __ecereMethod___ecereNameSpace__ecere__com__Map_Free(struct __ecereNameSpac { struct __ecereNameSpace__ecere__com__MapNode * node; -while((node = ((struct __ecereNameSpace__ecere__com__MapNode *)(uintptr_t)((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root))) +while((node = (void *)(((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root))) { struct __ecereNameSpace__ecere__com__MapNode * n = node; @@ -673,7 +673,7 @@ __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpa struct __ecereNameSpace__ecere__com__MapNode * __ecereMethod___ecereNameSpace__ecere__com__Map_GetAtPosition(struct __ecereNameSpace__ecere__com__Instance * this, const uint64 pos, unsigned int create) { -struct __ecereNameSpace__ecere__com__MapNode * node = (void *)(((struct __ecereNameSpace__ecere__com__MapNode *)(uintptr_t)((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root) ? __ecereMethod___ecereNameSpace__ecere__com__AVLNode_Find((void *)(((struct __ecereNameSpace__ecere__com__MapNode *)(uintptr_t)((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root)), ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[5].__anon1.__anon1.dataTypeClass, pos) : (((void *)0))); +struct __ecereNameSpace__ecere__com__MapNode * node = (void *)(((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root ? __ecereMethod___ecereNameSpace__ecere__com__AVLNode_Find(((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root, ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[5].__anon1.__anon1.dataTypeClass, pos) : (((void *)0))); if(!node && create) { @@ -728,7 +728,7 @@ return newNode; } else { -struct __ecereNameSpace__ecere__com__MapNode * node = (void *)(((struct __ecereNameSpace__ecere__com__MapNode *)(uintptr_t)((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root) ? __ecereMethod___ecereNameSpace__ecere__com__AVLNode_Find((void *)(((struct __ecereNameSpace__ecere__com__MapNode *)(uintptr_t)((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root)), ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[5].__anon1.__anon1.dataTypeClass, (uint64)__ecereProp___ecereNameSpace__ecere__com__MapNode_Get_key(newNode)) : (((void *)0))); +struct __ecereNameSpace__ecere__com__MapNode * node = (void *)(((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root ? __ecereMethod___ecereNameSpace__ecere__com__AVLNode_Find(((struct __ecereNameSpace__ecere__com__CustomAVLTree *)(((char *)this + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->root, ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[5].__anon1.__anon1.dataTypeClass, (uint64)__ecereProp___ecereNameSpace__ecere__com__MapNode_Get_key(newNode)) : (((void *)0))); if(!node) { diff --git a/compiler/bootstrap/libec/bootstrap/ecdefs.c b/compiler/bootstrap/libec/bootstrap/ecdefs.c index a06e84c..f198454 100644 --- a/compiler/bootstrap/libec/bootstrap/ecdefs.c +++ b/compiler/bootstrap/libec/bootstrap/ecdefs.c @@ -2236,7 +2236,7 @@ void __ecereMethod_External_CreateUniqueEdge(struct External * this, struct Exte struct TopoEdge * i; struct __ecereNameSpace__ecere__com__Instance * __internalLinkList = from->outgoing; -for(i = ((struct TopoEdge *)(uintptr_t)((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)__internalLinkList + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first); i; i = (struct TopoEdge *)((struct __ecereNameSpace__ecere__com__IteratorPointer * (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * pointer))__extension__ ({ +for(i = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)__internalLinkList + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first; i; i = (struct TopoEdge *)((struct __ecereNameSpace__ecere__com__IteratorPointer * (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * pointer))__extension__ ({ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = __internalLinkList; __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__LinkList->_vTbl; diff --git a/compiler/bootstrap/libec/bootstrap/freeAst.c b/compiler/bootstrap/libec/bootstrap/freeAst.c index c2ce274..e4a7d22 100644 --- a/compiler/bootstrap/libec/bootstrap/freeAst.c +++ b/compiler/bootstrap/libec/bootstrap/freeAst.c @@ -2777,7 +2777,7 @@ void FreeExternal(struct External * external) { struct TopoEdge * e; -while((e = ((struct TopoEdge *)(uintptr_t)((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)external->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first))) +while((e = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)external->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first)) { ((void (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * it))__extension__ ({ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = e->from->outgoing; @@ -2791,7 +2791,7 @@ __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpa })[__ecereVMethodID___ecereNameSpace__ecere__com__Container_Remove])(external->incoming, (struct __ecereNameSpace__ecere__com__IteratorPointer *)e); ((e ? (__ecereClass_TopoEdge->Destructor ? __ecereClass_TopoEdge->Destructor((void *)e) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(e)) : 0), e = 0); } -while((e = ((struct TopoEdge *)(uintptr_t)((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)external->outgoing + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first))) +while((e = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)external->outgoing + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first)) { ((void (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * it))__extension__ ({ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = e->to->incoming; diff --git a/compiler/bootstrap/libec/bootstrap/pass0.c b/compiler/bootstrap/libec/bootstrap/pass0.c index e02d1ae..e5ddd4a 100644 --- a/compiler/bootstrap/libec/bootstrap/pass0.c +++ b/compiler/bootstrap/libec/bootstrap/pass0.c @@ -1959,7 +1959,7 @@ if(symbol->__anon2.__anon1.structExternal) struct TopoEdge * e; struct __ecereNameSpace__ecere__com__Instance * __internalLinkList = symbol->__anon2.__anon1.structExternal->incoming; -for(e = ((struct TopoEdge *)(uintptr_t)((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)__internalLinkList + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first); e; e = (struct TopoEdge *)((struct __ecereNameSpace__ecere__com__IteratorPointer * (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * pointer))__extension__ ({ +for(e = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)__internalLinkList + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first; e; e = (struct TopoEdge *)((struct __ecereNameSpace__ecere__com__IteratorPointer * (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * pointer))__extension__ ({ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = __internalLinkList; __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__LinkList->_vTbl; @@ -1970,7 +1970,7 @@ __ecereMethod_External_CreateUniqueEdge(external, e->from, e->breakable); struct TopoEdge * e; struct __ecereNameSpace__ecere__com__Instance * __internalLinkList = symbol->__anon2.__anon1.structExternal->outgoing; -for(e = ((struct TopoEdge *)(uintptr_t)((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)__internalLinkList + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first); e; e = (struct TopoEdge *)((struct __ecereNameSpace__ecere__com__IteratorPointer * (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * pointer))__extension__ ({ +for(e = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)__internalLinkList + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first; e; e = (struct TopoEdge *)((struct __ecereNameSpace__ecere__com__IteratorPointer * (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * pointer))__extension__ ({ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = __internalLinkList; __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__LinkList->_vTbl; diff --git a/compiler/bootstrap/libec/bootstrap/pass15.c b/compiler/bootstrap/libec/bootstrap/pass15.c index 673703f..59a81b4 100644 --- a/compiler/bootstrap/libec/bootstrap/pass15.c +++ b/compiler/bootstrap/libec/bootstrap/pass15.c @@ -17549,9 +17549,17 @@ if(curParam && tClass->templateArgs[id].__anon1.__anon1.dataTypeString) struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = tClass->templateArgs[id]; struct Context * context = SetupTemplatesContext(tClass); unsigned int constant = exp->expType->constant; +unsigned int passAsTemplate = 0; +struct __ecereNameSpace__ecere__com__Class * thisClassFrom = (((void *)0)); +struct Type * t = ProcessTypeString(exp->expType->__anon1.templateParameter->dataTypeString, 0); +if(t && t->kind == 8 && t->__anon1._class) +thisClassFrom = t->__anon1._class->__anon1.registered; +FreeType(t); +passAsTemplate = tClass->templateClass && (exp->expType->kind != 20 || (!exp->expType->__anon1.templateParameter || (!exp->expType->__anon1.templateParameter->dataTypeString && !exp->expType->__anon1.templateParameter->__anon1.dataType))); FreeType(exp->expType); exp->expType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0); +exp->expType->thisClassFrom = thisClassFrom; if(exp->expType->kind == 8 && constant) exp->expType->constant = 1; else if(exp->expType->kind == 13) @@ -17570,7 +17578,7 @@ if(exp->expType->kind == 21) FreeType(exp->expType); exp->expType = ReplaceThisClassType(_class); } -if(tClass->templateClass && (exp->expType->kind != 20 || (!exp->expType->__anon1.templateParameter || (!exp->expType->__anon1.templateParameter->dataTypeString && !exp->expType->__anon1.templateParameter->__anon1.dataType)))) +if(passAsTemplate) exp->expType->passAsTemplate = 1; if(!exp->destType) { diff --git a/compiler/bootstrap/libec/bootstrap/pass16.c b/compiler/bootstrap/libec/bootstrap/pass16.c index 9dcf5e3..6d53518 100644 --- a/compiler/bootstrap/libec/bootstrap/pass16.c +++ b/compiler/bootstrap/libec/bootstrap/pass16.c @@ -2376,11 +2376,11 @@ if(isInstance) { struct TopoEdge * e, * next; -for(e = ((struct TopoEdge *)(uintptr_t)((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)external->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first); e; e = next) +for(e = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)external->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first; e; e = next) { struct External * from = e->from; -next = ((struct TopoEdge *)(uintptr_t)e->in.next); +next = e->in.next; if(((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)from->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->count) { unsigned int reroute = 1; @@ -2424,7 +2424,7 @@ __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpa struct TopoEdge * i; struct __ecereNameSpace__ecere__com__Instance * __internalLinkList = createInstancesExternal->incoming; -for(i = ((struct TopoEdge *)(uintptr_t)((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)__internalLinkList + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first); i; i = (struct TopoEdge *)((struct __ecereNameSpace__ecere__com__IteratorPointer * (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * pointer))__extension__ ({ +for(i = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)__internalLinkList + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first; i; i = (struct TopoEdge *)((struct __ecereNameSpace__ecere__com__IteratorPointer * (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * pointer))__extension__ ({ struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = __internalLinkList; __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__LinkList->_vTbl; diff --git a/compiler/bootstrap/libec/bootstrap/pass3.c b/compiler/bootstrap/libec/bootstrap/pass3.c index c43efd6..40daa7e 100644 --- a/compiler/bootstrap/libec/bootstrap/pass3.c +++ b/compiler/bootstrap/libec/bootstrap/pass3.c @@ -1205,7 +1205,7 @@ if((n = S.first)) { __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&S, (struct __ecereNameSpace__ecere__com__IteratorPointer *)n); __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&L, n); -for(e = ((struct TopoEdge *)(uintptr_t)((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)n->outgoing + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first); e; e = ne) +for(e = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)n->outgoing + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first; e; e = ne) { struct External * m = e->to; struct __ecereNameSpace__ecere__sys__OldList * list; @@ -1220,7 +1220,7 @@ list = &B; } if(!(*list).count) __ecereNameSpace__ecere__com__PrintLn(__ecereClass_char__PTR_, "!!! Something's wrong !!!", (void *)0); -ne = ((struct TopoEdge *)(uintptr_t)e->out.next); +ne = e->out.next; if(!e->breakable) { m->nonBreakableIncoming--; @@ -1251,14 +1251,14 @@ __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&B, m); else if((n = B.first)) { __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&B, (struct __ecereNameSpace__ecere__com__IteratorPointer *)n); -for(e = ((struct TopoEdge *)(uintptr_t)((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)n->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first); e; e = ne) +for(e = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)n->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first; e; e = ne) { struct TopoEdge * e2, * n2; struct External * m = e->from; struct External * f; f = __ecereMethod_External_ForwardDeclare(m); -ne = ((struct TopoEdge *)(uintptr_t)e->in.next); +ne = e->in.next; { struct External * c, * next; @@ -1277,9 +1277,9 @@ __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&B, c); } } } -for(e2 = ((struct TopoEdge *)(uintptr_t)((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)m->outgoing + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first); e2; e2 = n2) +for(e2 = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)m->outgoing + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first; e2; e2 = n2) { -n2 = ((struct TopoEdge *)(uintptr_t)e2->out.next); +n2 = e2->out.next; if(e2->breakable) { struct External * to = e2->to; @@ -1668,8 +1668,6 @@ if(!dest->passAsTemplate && dest->kind == 8 && dest->__anon1._class && dest->__a { struct __ecereNameSpace__ecere__com__Class * dc = dest->__anon1._class->__anon1.registered; -if(dest->thisClassFrom) -dc = dest->thisClassFrom; if(sc->templateClass) sc = sc->templateClass; if(dc->templateClass) diff --git a/compiler/libec/src/pass15.ec b/compiler/libec/src/pass15.ec index 6fff8f6..8a4f2a9 100644 --- a/compiler/libec/src/pass15.ec +++ b/compiler/libec/src/pass15.ec @@ -10314,11 +10314,22 @@ void ProcessExpressionType(Expression exp) ClassTemplateArgument arg = tClass.templateArgs[id]; Context context = SetupTemplatesContext(tClass); bool constant = exp.expType.constant; + bool passAsTemplate = false; + Class thisClassFrom = null; + Type t = ProcessTypeString(exp.expType.templateParameter.dataTypeString, false); + if(t && t.kind == classType && t._class) + thisClassFrom = t._class.registered; + FreeType(t); + + passAsTemplate = tClass.templateClass && (exp.expType.kind != templateType || + (!exp.expType.templateParameter || (!exp.expType.templateParameter.dataTypeString && !exp.expType.templateParameter.dataType))); + /*if(!arg.dataType) arg.dataType = ProcessTypeString(arg.dataTypeString, false);*/ FreeType(exp.expType); exp.expType = ProcessTypeString(arg.dataTypeString, false); + exp.expType.thisClassFrom = thisClassFrom; if(exp.expType.kind == classType && constant) exp.expType.constant = true; else if(exp.expType.kind == pointerType) { @@ -10334,7 +10345,7 @@ void ProcessExpressionType(Expression exp) exp.expType = ReplaceThisClassType(_class); } - if(tClass.templateClass && (exp.expType.kind != templateType || (!exp.expType.templateParameter || (!exp.expType.templateParameter.dataTypeString && !exp.expType.templateParameter.dataType)))) + if(passAsTemplate) exp.expType.passAsTemplate = true; //exp.expType.refCount++; if(!exp.destType) diff --git a/compiler/libec/src/pass3.ec b/compiler/libec/src/pass3.ec index 1308387..5eb61b1 100644 --- a/compiler/libec/src/pass3.ec +++ b/compiler/libec/src/pass3.ec @@ -500,8 +500,6 @@ static void AddPointerCast(Expression e) if(!dest.passAsTemplate && dest.kind == classType && dest._class && dest._class.registered) { Class dc = dest._class.registered; - if(dest.thisClassFrom) - dc = dest.thisClassFrom; if(sc.templateClass) sc = sc.templateClass; if(dc.templateClass) dc = dc.templateClass; -- 1.8.3.1