Ignore:
Timestamp:
Aug 23, 2008, 11:39:31 PM (16 years ago)
Author:
dai
Message:

ジェネリッククラスにおいて、実型パラメータに固定型が指定されたジェネリッククラスを継承すると、基底クラスの型パラメータが不正に置き換わってしまう不具合を修正。例えば、下記のようなコードに問題が生じるていた。

#console
Class Foo<T>
Public
	Function GetTypeName( t As T ) As String
		Return t.GetType().Name
	End Function
End Class
Class Bar<T>
	Inherits Foo<String>
End Class
Dim bar = New Bar
System.Console.WriteLine( bar.GetTypeName( New String() ) )
System.Console.ReadLine()
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp

    r728 r732  
    14381438    }
    14391439
     1440    // 実型パラメータに値型が含まれないとき
     1441    bool isValueType = false;
     1442    BOOST_FOREACH( const Type &actualType, actualTypes )
     1443    {
     1444        if( actualType.IsValueType() )
     1445        {
     1446            isValueType = true;
     1447        }
     1448    }
     1449    if( !isValueType )
     1450    {
     1451        return &_class;
     1452    }
     1453
    14401454    // 展開済みのクラスがあればそれを返す
    14411455    BOOST_FOREACH( const ExpandedTemplateClass *pExpandedTemplateClass, _class.expandedTemplateClasses )
     
    14721486    if( _class.HasSuperClass() )
    14731487    {
    1474         const CClass *pExpandedSuperClass = TemplateExpand( *const_cast<CClass *>(&_class.GetSuperClass()), actualTypes );
    1475         pNewClass->InheritsClass( *pExpandedSuperClass, pNewClass->GetSuperClassActualTypeParameters(), -1 );
     1488        Types expandedSuperClassActualTypes;
     1489        BOOST_FOREACH( const Type &superClassActualType, _class.GetSuperClassActualTypeParameters() )
     1490        {
     1491            expandedSuperClassActualTypes.push_back( TemplateExpand_ResolveType( superClassActualType, actualTypes ) );
     1492        }
     1493
     1494        const CClass *pExpandedSuperClass = TemplateExpand( *const_cast<CClass *>(&_class.GetSuperClass()), expandedSuperClassActualTypes );
     1495        pNewClass->InheritsClass( *pExpandedSuperClass, expandedSuperClassActualTypes, -1 );
    14761496    }
    14771497
Note: See TracChangeset for help on using the changeset viewer.