Consider the following program:
program stringtypeoverloadproblem;
{$mode objfpc}{$H+}
uses
sysutils;
var
Foo: String;
begin
Foo := ConcatPaths(['foo', 'bar']);
end.With fpc 3.0 this will fail to compile with the error:
Hint: (11030) Start of reading config file
C:\lazarus\fpc\3.0.0\bin\i386-win32\fpc.cfg
Hint: (11031) End of reading config file
C:\lazarus\fpc\3.0.0\bin\i386-win32\fpc.cfg
Free Pascal Compiler version 3.0.0 [2015/12/07] for i386 Copyright (c) 1993-2015 by Florian Klaempfl and others (1002) Target OS: Win32 for i386
(3104) Compiling stringtypeoverloadproblem.lpr
C:\Users\xec3\workspace\testus\stringtypeoverloadproblem.lpr(12,10) Error: (4057) Can't determine which overloaded function to call Hint: (5039) Found declaration: ConcatPaths(const {Open} Array Of RawByteString):AnsiString;
Hint: (5039) Found declaration: ConcatPaths(const {Open} Array Of UnicodeString):UnicodeString;
stringtypeoverloadproblem.lpr(15) Fatal: (10026) There were 1 errors compiling module, stopping
Fatal: (1018) Compilation aborted
Error: C:\lazarus\fpc\3.0.0\bin\i386-win32\ppc386.exe returned an error exitcode
The reason is it seems it cannot decide which type of strings should be used for passing to the function. The workaround is to explicitely cast one of them to a certain string type first.
Is this intentional that a string litereal does not default to a certain type (for example the same type that the Type "String" defaults to, in this case with the $H+ switch this would be AnsiString?
Is there maybe another compiler directive for this (which I did not find but I may have overlooked it) or maybe should such a directive be created if it does not exist yet?
The problem has occurred when updating to the new Lazarus release candidate wich comes with 3.0 and some older code of mine failed to compile, now I have fixed it by explicitely assigning the type AnsiString to some of my previously untyped string constants. This mabe me wonder why
const
FOO_DIR = 'foobar';would not just simply make an AnsiString constant by default, even when not explicitely writing
const
FOO_DIR: AnsiString = 'foobar';-Bernd
