72 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdio.h>
 | 
						|
 | 
						|
enum fred
 | 
						|
{
 | 
						|
   a,
 | 
						|
   b,
 | 
						|
   c,
 | 
						|
   d,
 | 
						|
   e = 54,
 | 
						|
   f = 73,
 | 
						|
   g,
 | 
						|
   h
 | 
						|
};
 | 
						|
 | 
						|
/* All following uses of enum efoo should compile
 | 
						|
   without warning.  While forward enums aren't ISO C,
 | 
						|
   it's accepted by GCC also in strict mode, and only warned
 | 
						|
   about with -pedantic.  This happens in the real world.  */
 | 
						|
/* Strict ISO C doesn't allow this kind of forward declaration of
 | 
						|
   enums, but GCC accepts it (and gives only pedantic warning), and
 | 
						|
   it occurs in the wild.  */
 | 
						|
enum efoo;
 | 
						|
struct Sforward_use {
 | 
						|
    int (*fmember) (enum efoo x);
 | 
						|
};
 | 
						|
 | 
						|
extern enum efoo it_real_fn(void);
 | 
						|
enum efoo {
 | 
						|
  ONE,
 | 
						|
  TWO,
 | 
						|
};
 | 
						|
struct S2 {
 | 
						|
  enum efoo (*f2) (void);
 | 
						|
};
 | 
						|
void should_compile(struct S2 *s)
 | 
						|
{
 | 
						|
  s->f2 = it_real_fn;
 | 
						|
}
 | 
						|
 | 
						|
enum efoo it_real_fn(void)
 | 
						|
{
 | 
						|
  return TWO;
 | 
						|
}
 | 
						|
 | 
						|
static unsigned int deref_uintptr(unsigned int *p)
 | 
						|
{
 | 
						|
  return *p;
 | 
						|
}
 | 
						|
 | 
						|
enum Epositive {
 | 
						|
    epos_one, epos_two
 | 
						|
};
 | 
						|
 | 
						|
int main()
 | 
						|
{
 | 
						|
   enum fred frod;
 | 
						|
   enum Epositive epos = epos_two;
 | 
						|
 | 
						|
   printf("%d %d %d %d %d %d %d %d\n", a, b, c, d, e, f, g, h);
 | 
						|
   /* printf("%d\n", frod); */
 | 
						|
   frod = 12;
 | 
						|
   printf("%d\n", frod);
 | 
						|
   frod = e;
 | 
						|
   printf("%d\n", frod);
 | 
						|
 | 
						|
   /* Following should compile without warning.  */
 | 
						|
   printf ("enum to int: %u\n", deref_uintptr(&epos));
 | 
						|
 | 
						|
   return 0;
 | 
						|
}
 | 
						|
 | 
						|
/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
 |