Bug 20655 - Attempt to use undefined structure tag triggers no diagnostic
Summary: Attempt to use undefined structure tag triggers no diagnostic
Status: RESOLVED WONTFIX
Alias: None
Product: gcc
Classification: Unclassified
Component: c (show other bugs)
Version: 4.1.0
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2005-03-27 15:33 UTC by Jozef Behran
Modified: 2005-07-23 22:49 UTC (History)
1 user (show)

See Also:
Host: i686-pc-linux-gnu
Target: i686-pc-linux-gnu
Build: i686-pc-linux-gnu
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jozef Behran 2005-03-27 15:33:29 UTC
/*** SNIP ***/  
/*  
  Place this file into `bug.c' (the code between the SNIP comments).  
  Then try `gcc -c -Wall bug.c'  
  The compiler silently transforms the type of the structure component 
  below to some kind of a generic pointer or something. 
  However it should output a diagnostic on the `UndefinedTag' identifier, 
  especially when -Wall is specified (as you can see above).  
  It is OK what the compiler does with this code but a warning should be  
  produced when the user really cares about them.  
  Without such a warning things often become confusing when someone  
  changes the tag in the declaration and forgets to update the tag name  
  in the pointers.  
*/  
  
typedef struct tagType {  
  struct UndefinedTag *Pointer;  
} TType;  
  
/*** SNIP ***/
Comment 1 Andrew Pinski 2005-03-27 16:15:03 UTC
This is still valid code because the struct could be defined below still.
For an example:
struct a
{
  struct b *c;
};

struct b
{
  int i;
  struct a *c;
};
Comment 2 Jozef Behran 2005-04-01 19:49:23 UTC
> This is still valid code because the struct could be defined below still. 
 
But if the struct is not defined anywhere (not even below its use), a warning should 
occur. If you send the first declaration to the compiler without sending the second 
one, you should see a warning about an undeclared structure. However if you 
send your example to the compiler as you mentioned it, no warnings should 
appear. This warning should at least indicate the users that there may be 
something wrong with their code and that they should check for typos or so. 
Note that the code is valid, but unusual. If you see a structure tag used 
somewhere without being declared, most likely it is a bug in the code. Otherwise 
the compiler may give the user very strange error/warning messages that may 
confuse him seriously (a structure type seeming not to be compatible with itself). 
Comment 3 jsm-csl@polyomino.org.uk 2005-04-01 20:19:47 UTC
Subject: Re:  Attempt to use undefined structure tag triggers
 no diagnostic

On Fri, 1 Apr 2005, jozef dot behran at krs dot sk wrote:

> Note that the code is valid, but unusual. If you see a structure tag used 
> somewhere without being declared, most likely it is a bug in the code. Otherwise 

No, if a tag is used without the structure or union contents being defined 
then most likely it is being used as an opaque type and the definition is 
in a separate internal header for e.g. the library implementation but does 
not form part of the public interface.

Comment 4 Andrew Pinski 2005-04-01 20:58:22 UTC
If you deference or do an assignment like:

TType *a, *b;
....
b->Pointer = a;

You will either get an error or a warning saying the code is invalid.

Also as mentioned by JSM, it is a way to provide opaque type pointers.