summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-01-04 12:54:47 +0000
committerjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-01-04 12:54:47 +0000
commit834b930de33f87896e00d683f13bca6c5544a8bb (patch)
tree9c54085f41c603c58ecb6f7da7f722432322b8ec
parentde7f468961bd4ba3b7558cced5162a1dd48362c5 (diff)
downloadfpc-834b930de33f87896e00d683f13bca6c5544a8bb.tar.gz
* perform real "exactness" checking for open array parameters
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@9624 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--compiler/defcmp.pas18
-rw-r--r--tests/tbf/tb0205.pp14
2 files changed, 25 insertions, 7 deletions
diff --git a/compiler/defcmp.pas b/compiler/defcmp.pas
index 1de11238c6..ef4c580ed9 100644
--- a/compiler/defcmp.pas
+++ b/compiler/defcmp.pas
@@ -705,7 +705,10 @@ implementation
{ open array -> open array }
if is_open_array(def_from) and
equal_defs(tarraydef(def_from).elementdef,tarraydef(def_to).elementdef) then
- eq:=te_equal
+ if tarraydef(def_from).elementdef=tarraydef(def_to).elementdef then
+ eq:=te_exact
+ else
+ eq:=te_equal
else
{ array -> open array }
if not(cdo_parameter in cdoptions) and
@@ -1566,12 +1569,13 @@ implementation
{ check type }
if eq=te_incompatible then
exit;
- { open arrays can never match exactly, since you cannot define }
- { a separate "open array" type -> we have to be able to }
- { consider those as exact when resolving forward definitions. }
- { The same goes for openstrings and array of const }
- if (is_open_array(currpara1.vardef) or
- is_array_of_const(currpara1.vardef) or
+ { open strings can never match exactly, since you cannot define }
+ { a separate "open string" type -> we have to be able to }
+ { consider those as exact when resolving forward definitions. }
+ { The same goes for array of const. Open arrays are handled }
+ { already (if their element types match exactly, they are }
+ { considered to be an exact match) }
+ if (is_array_of_const(currpara1.vardef) or
is_open_string(currpara1.vardef)) and
(eq=te_equal) and
(cpo_openequalisexact in cpoptions) then
diff --git a/tests/tbf/tb0205.pp b/tests/tbf/tb0205.pp
new file mode 100644
index 0000000000..16ec5b5c36
--- /dev/null
+++ b/tests/tbf/tb0205.pp
@@ -0,0 +1,14 @@
+{ %fail }
+
+procedure test(a: array of longint); forward;
+
+type
+ tl = type longint;
+
+procedure test(a: array of tl);
+begin
+end;
+
+begin
+end.
+