Changeset 638

Show
Ignore:
Timestamp:
08/28/10 01:49:32 (1 year ago)
Author:
walter
Message:

partial apply of bugzilla 2511 - Covariant return type doesn't work with circular import

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/dmd-1.x/src/aggregate.h

    r618 r638  
    238238    virtual int isBaseOf(ClassDeclaration *cd, int *poffset); 
    239239 
     240    virtual int isBaseInfoComplete(); 
    240241    Dsymbol *search(Loc, Identifier *ident, int flags); 
    241242#if DMDV2 
     
    287288    int isBaseOf(BaseClass *bc, int *poffset); 
    288289    const char *kind(); 
     290    int isBaseInfoComplete(); 
    289291    int vtblOffset(); 
    290292#if DMDV2 
  • branches/dmd-1.x/src/class.c

    r520 r638  
    820820} 
    821821 
     822/********************************************* 
     823 * Determine if 'this' has complete base class information. 
     824 * This is used to detect forward references in covariant overloads. 
     825 */ 
     826 
     827int ClassDeclaration::isBaseInfoComplete() 
     828{ 
     829    if (!baseClass) 
     830        return 0; 
     831    for (int i = 0; i < baseclasses->dim; i++) 
     832    {   BaseClass *b = (BaseClass *)baseclasses->data[i]; 
     833        if (!b->base || !b->base->isBaseInfoComplete()) 
     834            return 0; 
     835    } 
     836    return 1; 
     837} 
     838 
    822839Dsymbol *ClassDeclaration::search(Loc loc, Identifier *ident, int flags) 
    823840{ 
     
    13111328} 
    13121329 
     1330/********************************************* 
     1331 * Determine if 'this' has clomplete base class information. 
     1332 * This is used to detect forward references in covariant overloads. 
     1333 */ 
     1334 
     1335int InterfaceDeclaration::isBaseInfoComplete() 
     1336{ 
     1337    assert(!baseClass); 
     1338    for (int i = 0; i < baseclasses->dim; i++) 
     1339    {   BaseClass *b = (BaseClass *)baseclasses->data[i]; 
     1340        if (!b->base || !b->base->isBaseInfoComplete ()) 
     1341            return 0; 
     1342    } 
     1343    return 1; 
     1344} 
     1345 
    13131346/**************************************** 
    13141347 * Determine if slot 0 of the vtbl[] is reserved for something else. 
  • trunk/src/aggregate.h

    r618 r638  
    241241    virtual int isBaseOf(ClassDeclaration *cd, int *poffset); 
    242242 
     243    virtual int isBaseInfoComplete(); 
    243244    Dsymbol *search(Loc, Identifier *ident, int flags); 
    244245#if DMDV2 
     
    290291    int isBaseOf(BaseClass *bc, int *poffset); 
    291292    const char *kind(); 
     293    int isBaseInfoComplete(); 
    292294    int vtblOffset(); 
    293295#if DMDV2 
  • trunk/src/class.c

    r520 r638  
    837837} 
    838838 
     839/********************************************* 
     840 * Determine if 'this' has complete base class information. 
     841 * This is used to detect forward references in covariant overloads. 
     842 */ 
     843 
     844int ClassDeclaration::isBaseInfoComplete() 
     845{ 
     846    if (!baseClass) 
     847        return 0; 
     848    for (int i = 0; i < baseclasses->dim; i++) 
     849    {   BaseClass *b = (BaseClass *)baseclasses->data[i]; 
     850        if (!b->base || !b->base->isBaseInfoComplete()) 
     851            return 0; 
     852    } 
     853    return 1; 
     854} 
     855 
    839856Dsymbol *ClassDeclaration::search(Loc loc, Identifier *ident, int flags) 
    840857{ 
     
    13561373} 
    13571374 
     1375/********************************************* 
     1376 * Determine if 'this' has clomplete base class information. 
     1377 * This is used to detect forward references in covariant overloads. 
     1378 */ 
     1379 
     1380int InterfaceDeclaration::isBaseInfoComplete() 
     1381{ 
     1382    assert(!baseClass); 
     1383    for (int i = 0; i < baseclasses->dim; i++) 
     1384    {   BaseClass *b = (BaseClass *)baseclasses->data[i]; 
     1385        if (!b->base || !b->base->isBaseInfoComplete ()) 
     1386            return 0; 
     1387    } 
     1388    return 1; 
     1389} 
     1390 
    13581391/**************************************** 
    13591392 * Determine if slot 0 of the vtbl[] is reserved for something else. 
  • trunk/src/mtype.c

    r619 r638  
    45414541        // If t1n is forward referenced: 
    45424542        ClassDeclaration *cd = ((TypeClass *)t1n)->sym; 
     4543#if 1 
    45434544        if (!cd->baseClass && cd->baseclasses->dim && !cd->isInterfaceDeclaration()) 
    4544         { 
    4545             return 3; 
     4545#else 
     4546        if (!cd->isBaseInfoComplete()) 
     4547#endif 
     4548        { 
     4549            return 3;   // forward references 
    45464550        } 
    45474551    }