Bug 34735

Summary: C99 6.7.4/3 is not diagnose
Product: gcc Reporter: Andrew Pinski <pinskia>
Component: cAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED INVALID    
Severity: normal CC: gcc-bugs
Priority: P3 Keywords: accepts-invalid
Version: 4.3.0   
Target Milestone: ---   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2008-01-11 09:28:29
Bug Depends on:    
Bug Blocks: 16989, 16622    

Description Andrew Pinski 2008-01-11 04:37:45 UTC
This is not rejected:
static int a()
{
  return 0;
}

extern int f(void);

inline int f(void)
{
  return a();
}

---- CUT ---

This violates C99 6.7.4/2 which says:
An inline definition of a function with external linkage shall not contain a definition of a
modifiable object with static storage duration, and shall not contain a reference to an
identifier with internal linkage.
Comment 1 Andrew Pinski 2008-01-11 05:15:45 UTC
We do reject this though:
static int a()
{
  return 0;
}
inline int f(void)
{
  return a();
}
extern int f(void);
Comment 2 Richard Biener 2008-01-11 09:28:29 UTC
Confirmed.
Comment 3 Geoff Keating 2008-01-14 00:55:34 UTC
The quoted paragraph does not apply to the first code example, because an "inline definition" is defined in paragraph 6 as:

If all of the &#64257;le scope declarations for a function in a translation unit include the inline function speci&#64257;er without extern, then the de&#64257;nition in that translation unit is an inline de&#64257;nition.

In this case, one of the declarations does not include the inline function specifier, so it's not an inline definition.

I am unclear on how the standard is supposed to apply to the second example, but IMO we should give the warning anyway.