Bug 25301 - [3.4 regression] ICE for sizeof of incomplete type
Summary: [3.4 regression] ICE for sizeof of incomplete type
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c (show other bugs)
Version: 3.4.5
: P3 normal
Target Milestone: 4.0.0
Assignee: Not yet assigned to anyone
URL:
Keywords: ice-on-invalid-code, monitored
Depends on:
Blocks:
 
Reported: 2005-12-07 20:30 UTC by Volker Reichelt
Modified: 2006-03-08 23:40 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
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 Volker Reichelt 2005-12-07 20:30:55 UTC
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.


The other problem is that the testcase in the testsuite PASSed
despite the ICE. The comment on top of the testcase says:

  /* This test case contains a large number of syntactic errors.  We
     believe the intent of the test is that the compiler simply not
     crash.  The set of error messages reported is different when the C
     parser is generated with bison 1.50 than 1.35.  It is not worth
     attempting to prevent this.  Instead, we use a single dg-error with
     a regexp that will match _all_ the errors indiscriminately.  The
     old error/warning/etc markers are kept around for reference, but
     disabled.

     Revisit after new (recursive descent) parser is implemented for C.
     -- zw 2002-10-17  */

  /* { dg-error ".*" "many syntax errors" { target *-*-* } 0 } */

Well, the regexp also matches the ICE-message, so the testcase is
now broken. While this is probably hard to fix in 3.4 and 4.0,
the testcase be revisited on mainline and the 4.1 branch where the
new C parser is in place.

I'll file a new PR for this.
Comment 1 Volker Reichelt 2005-12-07 20:38:18 UTC
The PR for the testcase in the testsuite is PR 25302.
Comment 2 Gabriel Dos Reis 2005-12-07 20:40:33 UTC
Subject: Re:   New: [3.4 regression] ICE for sizofe of incomplete type

"reichelt at gcc dot gnu dot org" <gcc-bugzilla@gcc.gnu.org> 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
Comment 3 Volker Reichelt 2005-12-07 20:47:50 UTC
Subject: Re:  [3.4 regression] ICE for sizofe of incomplete type

On  7 Dec, gdr at integrable-solutions dot net wrote:

> 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

Would you mind filing this PR then?

Thanks,
Volker


Comment 4 Andrew Pinski 2006-03-08 23:40:39 UTC
Fixed in 4.0.0.  3.4.6 has been tagged already and has been released (no announcement has been made but it is up on the ftp server already).