Bug 14124 - enum definition with __attribute__((packed)) gives syntax errors
Summary: enum definition with __attribute__((packed)) gives syntax errors
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 3.3.2
: P2 enhancement
Target Milestone: 4.0.0
Assignee: Not yet assigned to anyone
URL:
Keywords: patch, wrong-code
: 18165 (view as bug list)
Depends on:
Blocks:
 
Reported: 2004-02-12 06:13 UTC by John Cooper
Modified: 2009-07-22 10:57 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail: 2.95.3 2.97 3.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1 3.1.1 3.1.2 3.2 3.2.1 3.2.2 3.2.3 3.3 3.3.1 3.3.2 3.3.3 3.4.0 4.0.0 4.0.1
Last reconfirmed: 2004-05-24 00:18:06


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description John Cooper 2004-02-12 06:13:28 UTC
On Linux 2.4.24, using gcc 3.3.2    
   
I'm following the instructions as described here:            
http://gcc.gnu.org/onlinedocs/gcc-3.3.2/gcc/Type-Attributes.html#Type%20Attributes           
           
Specifically, I say           
   enum testEnum { x = 1, y = 2 } __attribute__((packed));           
          
and I get:          
   error: semicolon missing after declaration of `testEnum'          
          
          
I've also tried:         
   enum __attribute__((packed))  testEnum2 { z = 3 };         
   typedef enum { abc = 4 } __attribute__((packed)) testEnum3;         
         
Both which fail with syntax errors.    See cpp and gcc output listings below. 
         
It is not practical for us to use -fshort-enums, so we really need this to         
work.    Please advise!         
         
Thanks 
-John 
 
Output of cpp:         
      
# 1 "enum.cpp"        
# 1 "<built-in>"        
# 1 "<command line>"        
# 1 "enum.cpp"        
enum testEnum { x = 1, y = 2 } __attribute__((packed));        
        
enum __attribute__((packed)) testEnum2 { z = 3 };        
        
typedef enum { abc = 4 } __attribute__((packed)) testEnum3;        
        
int main()        
{        
        testEnum t;        
        testEnum2 tt;        
        testEnum3 ttt        
}       
       
---------------------------------       
Output of gcc -v -save-temps enum.cpp :  
  
Reading specs from /home/jcooper/bin/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/specs   
Configured with: ../gcc-3.3.2/configure --prefix=/home/jcooper/bin   
Thread model: posix   
gcc version 3.3.2   
 /home/jcooper/bin/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/cc1plus -E -D__GNUG__=3   
-quiet -v -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=2   
-D_GNU_SOURCE enum.cpp enum.ii   
ignoring nonexistent directory "/home/jcooper/bin/i686-pc-linux-gnu/include"   
#include "..." search starts here:   
#include <...> search starts here:   
 /home/jcooper/bin/include/c++/3.3.2   
 /home/jcooper/bin/include/c++/3.3.2/i686-pc-linux-gnu   
 /home/jcooper/bin/include/c++/3.3.2/backward   
 /usr/local/include   
 /home/jcooper/bin/include   
 /home/jcooper/bin/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include   
 /usr/include   
End of search list.   
 /home/jcooper/bin/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/cc1plus -fpreprocessed   
enum.ii -quiet -dumpbase enum.cpp -auxbase enum -version -o enum.s   
GNU C++ version 3.3.2 (i686-pc-linux-gnu)   
        compiled by GNU C version 3.3.2.   
GGC heuristics: --param ggc-min-expand=36 --param ggc-min-heapsize=11837   
enum.cpp:1: error: semicolon missing after declaration of `testEnum'   
enum.cpp:3: error: parse error before `__attribute__'   
enum.cpp:5: error: semicolon missing after enum declaration   
enum.cpp: In function `int main()':   
enum.cpp:10: error: `testEnum2' undeclared (first use this function)   
enum.cpp:10: error: (Each undeclared identifier is reported only once for each   
   function it appears in.)   
enum.cpp:10: error: parse error before `;' token
Comment 1 Andrew Pinski 2004-02-12 09:04:39 UTC
Well this is no longer rejected on 3.4.0 but it still ignores the attribute for some reason.  I think the 
documention was written for the C front-end but never updated for the C++ front-end at all.
Comment 2 John Cooper 2004-02-12 15:40:50 UTC
Thanks Andrew for confirming.

I see you've reclassified it as an enhancement.  That being the case, can I 
expect it to be fixed in the near term??  

If not, do you have any suggestions for a workaround?  The reason we can't use 
-fshort-enums is it's a large complex system with interfaces into other systems.
..  using -fshort-enums invariably leads to incosistencies and segfaults :(

Thanks again,
-John


Comment 3 Giovanni Bajo 2004-02-12 16:05:07 UTC
I'm afraid it will take a while for this feature to be added. It is in fact an 
enhancement request. Also, even if a patch was made today, it would not be 
eligible for 3.4.x anymore, so it would go into 3.5.x, which won't see the 
light until 2005.

Of course, if you can use a custom compiler version, you could backport such a 
patch to a local 3.4-based compiler. If you really need it done fast, I'm sure 
you can find a contractor that can develop it quite fast. I suggest you to ask 
on the gcc mailing list about it.
Comment 4 Andrew Pinski 2004-10-26 21:56:48 UTC
*** Bug 18165 has been marked as a duplicate of this bug. ***
Comment 5 Andrew Pinski 2004-10-28 04:42:26 UTC
Patch here: <http://gcc.gnu.org/ml/gcc-patches/2004-10/msg02462.html>.
Comment 6 Andrew Pinski 2004-10-29 02:11:04 UTC
Fixed in 4.0.0.
Comment 7 Alex Tingle 2009-07-22 10:57:32 UTC
There are still problems with packed enums. John Cooper's example program compiles on g++ 4.3.2, but testEnum2 is still not packed. More details in Bug #39219.