Explorar el Código

* fix for Mantis #28753: don't return generic dummys from single_type(); ensures that parameters correctly evaluate to error defs should generic dummies be used

git-svn-id: trunk@34534 -
svenbarth hace 8 años
padre
commit
386b7ac154
Se han modificado 3 ficheros con 41 adiciones y 15 borrados
  1. 1 0
      .gitattributes
  2. 22 15
      compiler/ptype.pas
  3. 18 0
      tests/webtbf/tw28753.pp

+ 1 - 0
.gitattributes

@@ -13734,6 +13734,7 @@ tests/webtbf/tw2853.pp svneol=native#text/plain
 tests/webtbf/tw2853a.pp svneol=native#text/plain
 tests/webtbf/tw2853b.pp svneol=native#text/plain
 tests/webtbf/tw2853c.pp svneol=native#text/plain
+tests/webtbf/tw28753.pp svneol=native#text/pascal
 tests/webtbf/tw2878.pp svneol=native#text/plain
 tests/webtbf/tw2972.pp svneol=native#text/plain
 tests/webtbf/tw2972b.pp svneol=native#text/plain

+ 22 - 15
compiler/ptype.pas

@@ -588,26 +588,33 @@ implementation
                   end;
               end
             else if (def.typ=undefineddef) and
-                (sp_generic_dummy in srsym.symoptions) and
-                parse_generic and
-                (current_genericdef.typ in [recorddef,objectdef]) and
-                (Pos(upper(srsym.realname),tabstractrecorddef(current_genericdef).objname^)=1) then
+                (sp_generic_dummy in srsym.symoptions) then
               begin
-                if m_delphi in current_settings.modeswitches then
+                if parse_generic and
+                    (current_genericdef.typ in [recorddef,objectdef]) and
+                    (Pos(upper(srsym.realname),tabstractrecorddef(current_genericdef).objname^)=1) then
                   begin
-                    srsym:=resolve_generic_dummysym(srsym.name);
-                    if assigned(srsym) and
-                        not (sp_generic_dummy in srsym.symoptions) and
-                        (srsym.typ=typesym) then
-                      def:=ttypesym(srsym).typedef
-                    else
+                    if m_delphi in current_settings.modeswitches then
                       begin
-                        Message(parser_e_no_generics_as_types);
-                        def:=generrordef;
-                      end;
+                        srsym:=resolve_generic_dummysym(srsym.name);
+                        if assigned(srsym) and
+                            not (sp_generic_dummy in srsym.symoptions) and
+                            (srsym.typ=typesym) then
+                          def:=ttypesym(srsym).typedef
+                        else
+                          begin
+                            Message(parser_e_no_generics_as_types);
+                            def:=generrordef;
+                          end;
+                      end
+                    else
+                      def:=current_genericdef;
                   end
                 else
-                  def:=current_genericdef;
+                  begin
+                    Message(parser_e_no_generics_as_types);
+                    def:=generrordef;
+                  end;
               end
             else if is_classhelper(def) and
                 not (stoParseClassParent in options) then

+ 18 - 0
tests/webtbf/tw28753.pp

@@ -0,0 +1,18 @@
+{ %FAIL }
+
+unit tw28753;
+
+{$mode delphi}
+
+interface
+
+type
+  TList<T> = class(TObject);
+
+implementation
+
+procedure ObjectListToJson(Value: TList);
+begin // Error: Internal error 200301231
+end;
+
+end.