This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Undefined static functions


Joseph S. Myers wrote:

C requires a diagnostic if a static function is used but not defined in a translation unit. The present implementation of this is a pedwarn in check_global_declarations in toplev.c.

(a) Which language front ends use this pedwarn, rather than avoiding getting that far with a translation unit using an undefined static function?

(b) Is there any reason this shouldn't be a hard error rather than just a pedwarn?

(c) This diagnostic is broken for C with -funit-at-a-time (implied by -O2), ": Search converges between 2004-07-08-trunk (#482) and 2004-07-09-trunk (#483).". Test (should be diagnosed, now isn't at -O2):

static void f0(void);
void g0(void) { f0(); }

I would guess TREE_SYMBOL_REFERENCED is being tested too early for unit-at-a-time mode; certainly it's the wrong way to implement this diagnostic.

(d) It also has always been broken with regard to calls that are optimised away; C90 and C99 are explicit that it is any use outside sizeof (sizeof whose result is an integer constant, in C99) that is erroneous. For example,

static void f1(void);
void g1(void) { if (0) { f1(); } }

should be diagnosed. Is there any reason this shouldn't be a hard error as well?

I propose to fix this C90 issue (which was missing from my original C90 project proposal) in the front end, and there is nothing tricky about so doing (flag all used static function decls, ignoring uses inside __alignof__ and keeping lists inside sizeof/typeof so they can be flagged afterwards if the result turns out nonconstant). It would however be convenient to be able to get rid of the checks in toplev.c (or make them internal_error if no errors have been given by the front end) by having all front ends give proper errors, to avoid the need to do anything special to avoid duplicate error messages.

(e) Consider the following C++ variation on the above program:

inline static void f1(void);
void g1(void) { if (0) { f1(); } }

Does "no diagnostic required" in C++03 [basic.def.odr] paragraph 3 apply to the whole paragraph, or only to the sentence it appears in? That is, is "An inline function shall be defined in every translation unit in which it is used." a diagnosable rule?

Yes. (And there's nothing wrong with issuing diagnostics that are not strictly required.)

If so, this program should be diagnosed by the C++ compiler (and the existing diagnostic for inline functions used but not defined should be a pedwarn or error not a warning).


I agree.

--
Mark Mitchell
CodeSourcery, LLC
(916) 791-8304
mark@codesourcery.com



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]