Ir al contenido


Foto

Bug del compilador en metodos genericos


  • Por favor identifícate para responder
5 respuestas en este tema

#1 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 15 diciembre 2016 - 10:16

Hola a todos,
 
He encontrado una falla que esta hace bastante tiempo en el compilador de Delphi. Se trata de que el compilador no es capaz de reportar hints y warnings en metodos genericos, cuando si escribimos el mismo metodo sin usar el tipo generico si puede detectar los potenciales problemas. Ya hemos hablado aqui de lo importante que son los hint y warning y ejemplos de situaciones en las que puede salvar el dia hay cientos, como este
 
He creado un reporte en el sitio de Embarcadero, este es el link
 
Cuantos mas voten en la incidencia, mayor prioridad deberia tener para el equipo de Embarcadero y deberiamos verlo solucionado
 
El problema es reproducible en Delphi 2010, Delphi 10 Seattle y Delphi 10.1 Berlin, por lo que asumo que existe desde Delphi 2009 que es cuando se introdujeron los genericos hasta el dia de hoy
 
Quien no disponga de una version nueva de Delphi puede reproducirlo facilmente con la version Delphi 10.1 Berlin Starter. En el reporte pueden encontrar el siguiente fragmento de codigo:
 
 


delphi
  1. type
  2. TTest = class
  3. public
  4. function GenericUnasignedFunctionResult<T>: Integer;
  5. function UnasignedFunctionResult: Integer;
  6. procedure UnusedLocalVar;
  7. procedure GenericUnusedLocalVar<T>;
  8. end;
  9.  
  10. procedure TTest.GenericUnusedLocalVar<T>;
  11. var
  12. Unused: Integer; // no se emite hint aqui
  13. begin
  14. end;
  15.  
  16. procedure TTest.UnusedLocalVar;
  17. var
  18. Unused: Integer; // H2164 Variable 'Unused' is declared but never used in 'TTest.Hint'
  19. begin
  20. end;
  21.  
  22. function TTest.UnasignedFunctionResult: Integer;
  23. begin
  24. // W1035 Return value of function 'TTest.UnasignedFunctionResult' might be undefined
  25. end;
  26.  
  27. function TTest.GenericUnasignedFunctionResult<T>: Integer;
  28. begin
  29. // no se emite warning aqui
  30. end;

 

 
Considero que este problema es de altisima prioridad y deberia ser solucionado lo antes posible
 
Asi que este es un llamado para que todo aquel que considere que este problema merece su debida importancia, vote el reporte, por favor


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 15 diciembre 2016 - 11:11

Estoy a favor tuyo Agustín.

Y seguramente como tu usas y estás acostumbrado a los genéricos, tu preocupación está más que fundada. Yo me sentiría igual si empleara más este recurso y viera que hay un bug no resuelto que afectara su uso.

 

Por lo pronto ya tienes un voto mio.

 

Saludos,


  • 1

#3 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 15 diciembre 2016 - 12:14

Gracias Marcelo

 

He intentado reproducirlo en FPC pero lamentablemente no admite esta sintaxis.. es decir esto no lo acepta:


delphi
  1. type
  2. TNoGenerico = class
  3. // procedure TestGenerico<T>; // no compila
  4. // procedure TestParamGenerico(const Value: T); // no compila
  5. end;
  6.  
  7. generic TGenerico<T> = class
  8. // procedure TestGenerico<T>; // no compila tampoco
  9. // generic procedure TestGenerico<T>; // no compila tampoco
  10. procedure TestParamGenerico(const Value: T); // esto si funciona
  11. end;

Estoy usando Lazarus 1.6 r51630 FPC 3.0.0 x86_64-win64-win32/win64


Editado por Agustin Ortu, 15 diciembre 2016 - 12:14 .

  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 15 diciembre 2016 - 12:39

Gracias Marcelo

 

He intentado reproducirlo en FPC pero lamentablemente no admite esta sintaxis.. es decir esto no lo acepta:


delphi
  1. type
  2. TNoGenerico = class
  3. // procedure TestGenerico<T>; // no compila
  4. // procedure TestParamGenerico(const Value: T); // no compila
  5. end;
  6.  
  7. generic TGenerico<T> = class
  8. // procedure TestGenerico<T>; // no compila tampoco
  9. // generic procedure TestGenerico<T>; // no compila tampoco
  10. procedure TestParamGenerico(const Value: T); // esto si funciona
  11. end;

Estoy usando Lazarus 1.6 r51630 FPC 3.0.0 x86_64-win64-win32/win64

 

En mi CT 5.6 tampoco funcionan las propuestas que dices. Estas son mis especificaciones:

 

Typhon version: 5.6
Typhon svn revision: 50892
Typhon build date: 2016/01/18
Typhon was compiled for x86_64-win64
Typhon was compiled with fpc 3.1.1

 

Hay que ver que tanto es el alcance que tienen los generics en Lazarus hasta el momento.  Se que se han llevado unas cuantas propuestas sobre genéricos. Quien sabe si más adelante se hacen algunas revisiones y cambian algo.

 

Tu sabes que yo medio que lo esquivo al tema. Me parece una navaja suiza. No me aventuro a decir mucho sobre que está bien, y que está mal.

 

Saludos,


  • 1

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 16 diciembre 2016 - 05:25

De a poco se está ganando más votos. Acabo de ver que al menos ya se dió la tarea al área de QA de revisar.

Y parece por lo que leí de Al esto está relacionado a otro error más.

 

¿Que no era que el Update 2 corrigió varios errores?

 

Saludos,


  • 1

#6 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 16 diciembre 2016 - 08:49

Si, parece que de a poco se esta difundiendo. No lo he probado en Berlin Update 2, pero una pasada rapida a la lista de correciones indica que nada ha cambiado.

 

En realidad Embarcadero estos ultimos años ha puesto mucho enfasis en cosas que muchos llaman "chorradas". La comunidad se esta moviendo mucho estos ultimos dias. Me gusta mucho el grupo de Google porque participan tambien del lado de Emba. Es muy comun verlo a Marco Cantu o a Nick Hodges comentando

 

Se esta "presionando" bastante para que se le de importancia a las mejoras al lenguaje y no a las "chorradas". Con chorradas se refieren a componentes nuevos, controles nuevos, ... el argumento de la comunidad es que eso los desarrolla "cualquiera", o ya hay algun equivalente por ahi. Lo que realmente necesitamos es mejorar el lenguaje.

 

A mi me parece que tiene mucho sentido lo que dicen, porque como se recalca, fue en Delphi 2009 cuando se agregaron mejoras sustanciales al lenguaje, concretamente metodos anonimos y genericos que cambio totalmente la forma en que se escribe el codigo. No solamente hablamos de codigo mas elegante, sino mas sencillo y poderoso. Eso le abrio la puerta al desarrollo de bibliotecas y frameworks que antes era imposible. Luego Delphi 2010 tambien dio un gran paso (aunque no tan impactante como el anterior) y agrego la RTTI mejorada y atributos. Estas cosas hicieron posible que frameworks como Spring, DSharp, DUnitX, Delphi Mocks y muchos mas, existan hoy

 

Yo soy optimista. Al menos Embarcadero promete de manera nativa el tipo nullable, que algunos ya gozamos porque gozamos del framework Spring. Tambien tendriamos el compilador para Linux. Es decir, me parece bien que dejen de lado las "chorradas" y se enfoquen en esto: mejorar el lenguaje, corregirle los errores, optimizar el codigo generado... las "chorradas" o el resto, se encarga la comunidad

 

 

En este enlace hay un "top" de las caracteristicas mas deseadas en el lenguaje 

 

Este blog por Vincent Parrett tambien tiene una lista de mejoras para el lenguaje y un analisis de porque deberia incluirse la caracteristica en Delphi. Este tipo creo bibliotecas libres como Delphi Mocs, DUnitX, y software FinalBuilder, Continua CI, etc. Este blog genero la siguiente discusion en donde hasta Allen Bauer participo

 

Aqui mismo publique el problema que discutimos aca. Nick Hodges me ha respondido y eso ya me pone mas tranquilo

 

 


  • 0




IP.Board spam blocked by CleanTalk.