|
|
@ -0,0 +1,36 @@ |
|
|
|
typedef signed t; |
|
|
|
typedef int plain; |
|
|
|
struct tag { |
|
|
|
unsigned t:4; // t is the name of the field |
|
|
|
const t:5; // t is the name of the type of the unnamed 5-bit field |
|
|
|
plain r:5; |
|
|
|
}; |
|
|
|
|
|
|
|
struct tag2 { |
|
|
|
int xx:8; |
|
|
|
int :8; // a field with no name |
|
|
|
int :8; // a field with no name |
|
|
|
int yy:8; |
|
|
|
}; |
|
|
|
|
|
|
|
typedef int a, (*b)(a intarg); |
|
|
|
// ^ ^----------------------------------------|-------| |
|
|
|
// (1) where does it say in the std that this name becomes a type name |
|
|
|
// even before the end of the typedef declarator list that is a part of? |
|
|
|
|
|
|
|
// (2) where in the std does is say how the scope of typedef names is |
|
|
|
// handled (global, function-level, block-level, etc.)? |
|
|
|
|
|
|
|
// (3) what are the exact rules about typedef scopes, and the different |
|
|
|
// contexts in which a typedef can occur that causes it to have non-local |
|
|
|
// or non-global scope? |
|
|
|
|
|
|
|
// (4) printTree to show the real AST in addition to outputNode which prints |
|
|
|
// source code. |
|
|
|
|
|
|
|
int c(int x) { return x; } |
|
|
|
|
|
|
|
b e = c; |
|
|
|
|
|
|
|
unsigned x; |
|
|
|
unsigned long int y; |