[fpc-pascal] Default type of string literals

Bernd prof7bit at gmail.com
Mon Jan 4 12:35:53 CET 2016

Consider the following program:

program stringtypeoverloadproblem;

{$mode objfpc}{$H+}


  Foo: String;

  Foo := ConcatPaths(['foo', 'bar']);

With fpc 3.0 this will fail to compile with the error:

Hint: (11030) Start of reading config file
Hint: (11031) End of reading config file
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
Error: (4057) Can't determine which overloaded function to call
Hint: (5039) Found declaration: ConcatPaths(const {Open} Array Of
Hint: (5039) Found declaration: ConcatPaths(const {Open} Array Of
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

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

    FOO_DIR = 'foobar';

would not just simply make an AnsiString constant by default, even
when not explicitely writing

    FOO_DIR: AnsiString = 'foobar';


More information about the fpc-pascal mailing list