compiler: don't allow record case with parameterized members

git-svn-id: trunk@16682 -
This commit is contained in:
paul 2011-01-02 14:01:09 +00:00
parent 55a0fefb1f
commit 79813da090
6 changed files with 401 additions and 377 deletions

1
.gitattributes vendored
View File

@ -9414,6 +9414,7 @@ tests/test/tgeneric22.pp svneol=native#text/pascal
tests/test/tgeneric23.pp svneol=native#text/pascal
tests/test/tgeneric24.pp svneol=native#text/pascal
tests/test/tgeneric25.pp svneol=native#text/pascal
tests/test/tgeneric26.pp svneol=native#text/pascal
tests/test/tgeneric3.pp svneol=native#text/plain
tests/test/tgeneric4.pp svneol=native#text/plain
tests/test/tgeneric5.pp svneol=native#text/plain

View File

@ -368,7 +368,7 @@ scanner_w_illegal_warn_identifier=02087_W_Illegal identifier "$1" for $WARN dire
#
# Parser
#
# 03303 is the last used one
# 03304 is the last used one
#
% \section{Parser messages}
% This section lists all parser messages. The parser takes care of the
@ -1363,6 +1363,9 @@ parser_e_no_constructor_in_records=03302_E_Constructors aren't allowed in record
parser_e_at_least_one_argument_must_be_of_type=03303_E_At least one argument must be of type "$1"
% It is required that at least one argument be of type of structure where this method is defined.
% For example class operators must contain at least one argument of the structure where they are defined.
parser_e_cant_use_type_parameters_here=03304_E_Type parameters may require initialization/finalization - can't be used in variant records
% Type parameters may be specialized with types which (e.g. \var{ansistring}) need initialization/finalization
% code which is implicitly generated by the compiler.
#
# Type Checking
#

View File

@ -392,6 +392,7 @@ const
parser_e_class_methods_only_static_in_records=03301;
parser_e_no_constructor_in_records=03302;
parser_e_at_least_one_argument_must_be_of_type=03303;
parser_e_cant_use_type_parameters_here=03304;
type_e_mismatch=04000;
type_e_incompatible_types=04001;
type_e_not_equal_types=04002;
@ -877,9 +878,9 @@ const
option_info=11024;
option_help_pages=11025;
MsgTxtSize = 58278;
MsgTxtSize = 58377;
MsgIdxMax : array[1..20] of longint=(
24,88,304,97,82,54,111,22,202,63,
24,88,305,97,82,54,111,22,202,63,
49,20,1,1,1,1,1,1,1,1
);

File diff suppressed because it is too large Load Diff

View File

@ -1492,9 +1492,12 @@ implementation
{ types that use init/final are not allowed in variant parts, but
classes are allowed }
if (variantrecordlevel>0) and
is_managed_type(hdef) then
Message(parser_e_cant_use_inittable_here);
if (variantrecordlevel>0) then
if is_managed_type(hdef) then
Message(parser_e_cant_use_inittable_here)
else
if hdef.typ=undefineddef then
Message(parser_e_cant_use_type_parameters_here);
{ try to parse the hint directives }
hintsymoptions:=[];

15
tests/test/tgeneric26.pp Normal file
View File

@ -0,0 +1,15 @@
{ %fail }
program tgeneric26;
{$mode objfpc}{$H+}
type
generic TRecArr<T> = array[0..1] of record
case enum:(one, two, three) of
one: (F: T); // can't use type parameter here
two: (Z: T);
three: (Y: T);
end;
begin
end.