compiler: fix nil constant interface
A nil interface has no dynamic type (or: nil dynamic type). Don't try to use the static type as the dynamic type, because these are different.
Этот коммит содержится в:
		
							родитель
							
								
									4ed04309a3
								
							
						
					
					
						коммит
						c100e4d67f
					
				
					 2 изменённых файлов: 4 добавлений и 10 удалений
				
			
		
							
								
								
									
										12
									
								
								compiler.go
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								compiler.go
									
										
									
									
									
								
							|  | @ -2279,16 +2279,10 @@ func (c *Compiler) parseConst(expr *ssa.Const) (llvm.Value, error) { | ||||||
| 		if expr.Value != nil { | 		if expr.Value != nil { | ||||||
| 			return llvm.Value{}, errors.New("non-nil interface constant") | 			return llvm.Value{}, errors.New("non-nil interface constant") | ||||||
| 		} | 		} | ||||||
| 		itfTypeNum, ok := c.ir.TypeNum(expr.Type()) | 		// Create a generic nil interface with no dynamic type (typecode=0). | ||||||
| 		if itfTypeNum >= 1<<16 { |  | ||||||
| 			return llvm.Value{}, errors.New("interface typecodes do not fit in a 16-bit integer") |  | ||||||
| 		} |  | ||||||
| 		if !ok { |  | ||||||
| 			panic("interface number is unknown") |  | ||||||
| 		} |  | ||||||
| 		fields := []llvm.Value{ | 		fields := []llvm.Value{ | ||||||
| 			llvm.ConstInt(llvm.Int16Type(), uint64(itfTypeNum), false), | 			llvm.ConstInt(llvm.Int16Type(), 0, false), | ||||||
| 			llvm.Undef(c.i8ptrType), | 			llvm.ConstPointerNull(c.i8ptrType), | ||||||
| 		} | 		} | ||||||
| 		itf := llvm.ConstNamedStruct(c.mod.GetTypeByName("runtime._interface"), fields) | 		itf := llvm.ConstNamedStruct(c.mod.GetTypeByName("runtime._interface"), fields) | ||||||
| 		return itf, nil | 		return itf, nil | ||||||
|  |  | ||||||
|  | @ -103,7 +103,7 @@ func (p *Program) AnalyseCallgraph() { | ||||||
| // Find all types that are put in an interface. | // Find all types that are put in an interface. | ||||||
| func (p *Program) AnalyseInterfaceConversions() { | func (p *Program) AnalyseInterfaceConversions() { | ||||||
| 	// Clear, if AnalyseTypes has been called before. | 	// Clear, if AnalyseTypes has been called before. | ||||||
| 	p.typesWithoutMethods = map[string]int{"interface{}": 0, "error": 1} | 	p.typesWithoutMethods = map[string]int{"nil": 0} | ||||||
| 	p.typesWithMethods = map[string]*InterfaceType{} | 	p.typesWithMethods = map[string]*InterfaceType{} | ||||||
| 
 | 
 | ||||||
| 	for _, f := range p.Functions { | 	for _, f := range p.Functions { | ||||||
|  |  | ||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 Ayke van Laethem
						Ayke van Laethem