On Friday, 5 February 2016 at 07:05:06 UTC, H. S. Teoh wrote:
On Fri, Feb 05, 2016 at 04:02:41AM +0000, tsbockman via Digitalmars-d wrote:
On Friday, 5 February 2016 at 03:46:37 UTC, Chris Wright wrote:
>On Fri, 05 Feb 2016 01:10:53 +0000, tsbockman wrote:
What information, specifically, is the compiler missing?

The compiler already computes the name and type signature of each function. As far as I can see, all that is necessary is to:

1) Insert that information (together with what file and line number it
came from) into a big list in a temporary file.
2) After all modules have been compiled, go back and sort the list by
function name.

This would make compilation of large projects excruciatingly slow.

It's a small fraction of the total data being handled by the compiler (smaller than the source code), and the list could probably be directly generated in a partially sorted state. Little-to-no random access to the list is required at any point in the process. It does not ever need to all be in RAM at the same time.

I can see it may cost more than it's actually worth, but where does the "excruciatingly slow" part come from?

3) Finally, scan the list for entries that share the same name, but have incompatible type signatures. Emit warning messages as needed. (The compiler should be used for this step, because it already has a lot of information about C's type system built into it that can help define "incompatible" sensibly.)

This fails for multi-executable projects, which may legally have different functions under the same name. (Even though that's arguably a very bad idea.)

Chris Wright pointed this out, as well. This just means the final pass should be done at link-time, though. It's not a fundamental problem with generating the warning.

As far as I can see, this requires an extra pass, but no additional information. What am I missing?

The fact that the C compiler only sees one file at a time, and has no idea which one, if any, of them will even end up in the final executable. Many projects produce multiple executables with some shared sources between them, and only the build system knows which file(s) go with which executables.

This could be worked around with a little cooperation between the compiler and the linker. It's not even a feature of C the language - it's just the way current tool chains happen to work.

Reply via email to