views:

1812

answers:

7

I have a function that gives me the following warning:

[DCC Warning] filename.pas(6939): W1035 Return value of function 'function' might be undefined

The function, however, is clean, small, and does have a known, expected, return value. The first statement in the function is:

Result := '';

and there is no local variable or parameter called Result either.

Is there any kind of pragma-like directive I can surround this method with to remove this warning? This is Delphi 2007.

Unfortunately, the help system on this Delphi installation is shot, so I can't pop up the help for that warning right now.

Anyone know off the top of their head what I can do?

+1  A: 

There seems to be some sort of bug in Delphi. Read this post, the last comment links to other bug-reports that may be the one that you have got:

http://qc.codegear.com/wc/qcmain.aspx?d=8144

Espo
I know, there's also a similar bug report about too many local variables and parameters combined causes this, but this function is really simple.Anyway, Delphi is buggy. What else is new :)
Lasse V. Karlsen
+4  A: 

Are you sure you have done everything to solve the warning? Maybe you could post the code for us to look at?

You can turn off the warning locally this way:

{$WARN NO_RETVAL OFF}
function func(...): string;
begin
  ...
end;
{$WARN NO_RETVAL ON}
Lars Truijens
The first statement in the function is giving the function a default return value. The rest of the function is one case statement and some calls to other functions from the case points.
Lasse V. Karlsen
A: 

The {$WARN NO_RETVAL OFF} is what you are looking for, but generally I like to find out why stuff like this happens. You might consider formatting it differently and seeing if that helps.

Do you have any flow altering commands like Exit in there? Do you directly raise exceptions, etc? Does your case statement have an else at the end that sets a value on Result?

Might try tweaking those elements and see if that eliminates the warning too.

Jim McKeeth
+1  A: 

In order to get a good answer for this, you'll have to post the code. In general, the Delphi compiler will give this warning if there is a possible code path that could result in the Result not being defined. Sometimes that code path is less than obvious.

Nick Hodges
When the code path follows an initial, unconditional line of code that explicitly initialises "result" (as explained in the question), then no matter how unobvious that code path is the warning is bogus (in this case).
Deltics
I agree we need to see the code to help. In my experience, Delphi never warns about missing return value when the return type is string. Even if result is not set.
Ville Krumlinde
+1  A: 

I am not sure that I want to see the code for this unit... after all, the error occurs at line 6939 ... Maybe some internal compiler table have been exceeded?

Lars Fosdal
A: 

I would certainly suggest adding a code comment as to why it was done if you turn such warnings off.

Graza
+1  A: 

There is such a bug in Delphi compiler since, at least, Delphi4: if sum of numbers of function's parameters (including Self and Result) and local variables exceeds 31, it causes problems. For example, it can write W1035 warnings (result might be undefined). It can miss not used variables. Just try this project:

program TestCompilerProblems;

procedure Proc;
var
  a01, a02, a03, a04, a05, a06, a07, a08, a09, a10,
  a11, a12, a13, a14, a15, a16, a17, a18, a19, a20,
  a21, a22, a23, a24, a25, a26, a27, a28, a29, a30,
  a31, a32, a33, a34, a35, a36, a37, a38, a39, a40: Integer;
begin
end;

begin
  Proc;
end.

It would cause 31 hint, not 40.

Abelevich

related questions