"reichelt at gcc dot gnu dot org" <[EMAIL PROTECTED]> writes:

| The testcase gcc.dg/noncompile/920923-1.c causes an ICE on the 3.4 branch.
| A reduced testcase is:
| 
| =======================
| typedef struct A B;
| int i = sizeof(B);
| =======================
| 
| bug.c:2: error: invalid application of `sizeof' to incomplete type `
| Internal compiler error: Error reporting routines re-entered.
| Please submit a full bug report, [etc.]
| 
| The culprit is the code in c-objc-common.c (c_tree_printer) <case 'T'>:
| 
|     case 'T':
|       if (TREE_CODE (t) == TYPE_DECL)
|         {
|           if (DECL_NAME (t))
|             n = (*lang_hooks.decl_printable_name) (t, 2);
|         }
|       else
|         {
|           t = TYPE_NAME (t);
|           if (t)
|             n = IDENTIFIER_POINTER (t);
|         }
|       break;
| 
| In the above case t is a RECORD_TYPE, but TYPE_NAME (t) is a TYPE_DECL.
| So there's some logic missing to handle this case.

In general, there is a "type" problem in both C and C++ front ends.
The documentation for TYPE_NAME says that it returns a TYPE_DECL -- as
opposed to an IDENTIFIER_NODE.  However, at various occasions I found
that a TYPE_NAME would return an IDENTIFIER_NODE.  That is a clear bug
in both front ends ans should be hunt.  Obviously, you have identified a
place where instead of correcting the problem the pretty-printer had
assumed that TYPE_NAME will always return an IDENTIFIER_NODE --
despite the documentation.  I believe a proper PR should be filled so
that both front ends are cured from that confusion. 

-- Gaby

Reply via email to