Currently, all symbols in enumerator-list are picked up as definition.
This patch makes symbols in expression be picked up as "reference or
other symbol". 

diffstat:
 libparser/C.c   |  142 ++++++++++++++++++++++++++++++++------------------------
 libparser/Cpp.c |  141 +++++++++++++++++++++++++++++++------------------------
 2 files changed, 163 insertions(+), 120 deletions(-)

=== example ===

$ cat -n a.c
     1  #define FRUIT_BASE      (1 << 16)
     2  enum { APPLE = FRUIT_BASE };
     3  typedef enum { APPLE = FRUIT_BASE } FOOD;
     4  #define ENUM_BASE(x)    ((x) << 16)
     5  enum { FRUIT = 1 };
     6  enum { APPLE = ENUM_BASE(FRUIT) };
     7  typedef enum { APPLE = ENUM_BASE(FRUIT) } FOOD;
     8  #define ENUM_BASE2(d, x)        ((x) << 16)
     9  enum { APPLE = ENUM_BASE2(0, FRUIT) };
    10  typedef enum { APPLE = ENUM_BASE2(0, FRUIT) } FOOD;

[ current CVS version ]
$ global -f a.c
FRUIT_BASE          1 a.c              #define FRUIT_BASE       (1 << 16)
APPLE               2 a.c              enum { APPLE = FRUIT_BASE };
FRUIT_BASE          2 a.c              enum { APPLE = FRUIT_BASE };
APPLE               3 a.c              typedef enum { APPLE = FRUIT_BASE } FOOD;
FRUIT_BASE          3 a.c              typedef enum { APPLE = FRUIT_BASE } FOOD;
FOOD                3 a.c              typedef enum { APPLE = FRUIT_BASE } FOOD;
ENUM_BASE           4 a.c              #define ENUM_BASE(x)     ((x) << 16)
FRUIT               5 a.c              enum { FRUIT = 1 };
APPLE               6 a.c              enum { APPLE = ENUM_BASE(FRUIT) };
ENUM_BASE           6 a.c              enum { APPLE = ENUM_BASE(FRUIT) };
FRUIT               6 a.c              enum { APPLE = ENUM_BASE(FRUIT) };
APPLE               7 a.c              typedef enum { APPLE = ENUM_BASE(FRUIT) 
} FOOD;
ENUM_BASE           7 a.c              typedef enum { APPLE = ENUM_BASE(FRUIT) 
} FOOD;
FRUIT               7 a.c              typedef enum { APPLE = ENUM_BASE(FRUIT) 
} FOOD;
FOOD                7 a.c              typedef enum { APPLE = ENUM_BASE(FRUIT) 
} FOOD;
ENUM_BASE2          8 a.c              #define ENUM_BASE2(d, x) ((x) << 16)
APPLE               9 a.c              enum { APPLE = ENUM_BASE2(0, FRUIT) };
ENUM_BASE2          9 a.c              enum { APPLE = ENUM_BASE2(0, FRUIT) };
FRUIT               9 a.c              enum { APPLE = ENUM_BASE2(0, FRUIT) };
APPLE              10 a.c              typedef enum { APPLE = ENUM_BASE2(0, 
FRUIT) } FOOD;
ENUM_BASE2         10 a.c              typedef enum { APPLE = ENUM_BASE2(0, 
FRUIT) } FOOD;
FRUIT              10 a.c              typedef enum { APPLE = ENUM_BASE2(0, 
FRUIT) } FOOD;
FOOD               10 a.c              typedef enum { APPLE = ENUM_BASE2(0, 
FRUIT) } FOOD;
$ global -frs a.c
x                   4 a.c              #define ENUM_BASE(x)     ((x) << 16)
x                   4 a.c              #define ENUM_BASE(x)     ((x) << 16)
d                   8 a.c              #define ENUM_BASE2(d, x) ((x) << 16)
x                   8 a.c              #define ENUM_BASE2(d, x) ((x) << 16)
x                   8 a.c              #define ENUM_BASE2(d, x) ((x) << 16)

[ patched version ]
$ global -f a.c
FRUIT_BASE          1 a.c              #define FRUIT_BASE       (1 << 16)
APPLE               2 a.c              enum { APPLE = FRUIT_BASE };
APPLE               3 a.c              typedef enum { APPLE = FRUIT_BASE } FOOD;
FOOD                3 a.c              typedef enum { APPLE = FRUIT_BASE } FOOD;
ENUM_BASE           4 a.c              #define ENUM_BASE(x)     ((x) << 16)
FRUIT               5 a.c              enum { FRUIT = 1 };
APPLE               6 a.c              enum { APPLE = ENUM_BASE(FRUIT) };
APPLE               7 a.c              typedef enum { APPLE = ENUM_BASE(FRUIT) 
} FOOD;
FOOD                7 a.c              typedef enum { APPLE = ENUM_BASE(FRUIT) 
} FOOD;
ENUM_BASE2          8 a.c              #define ENUM_BASE2(d, x) ((x) << 16)
APPLE               9 a.c              enum { APPLE = ENUM_BASE2(0, FRUIT) };
APPLE              10 a.c              typedef enum { APPLE = ENUM_BASE2(0, 
FRUIT) } FOOD;
FOOD               10 a.c              typedef enum { APPLE = ENUM_BASE2(0, 
FRUIT) } FOOD;
$ global -frs a.c
FRUIT_BASE          2 a.c              enum { APPLE = FRUIT_BASE };
FRUIT_BASE          3 a.c              typedef enum { APPLE = FRUIT_BASE } FOOD;
x                   4 a.c              #define ENUM_BASE(x)     ((x) << 16)
x                   4 a.c              #define ENUM_BASE(x)     ((x) << 16)
ENUM_BASE           6 a.c              enum { APPLE = ENUM_BASE(FRUIT) };
FRUIT               6 a.c              enum { APPLE = ENUM_BASE(FRUIT) };
ENUM_BASE           7 a.c              typedef enum { APPLE = ENUM_BASE(FRUIT) 
} FOOD;
FRUIT               7 a.c              typedef enum { APPLE = ENUM_BASE(FRUIT) 
} FOOD;
d                   8 a.c              #define ENUM_BASE2(d, x) ((x) << 16)
x                   8 a.c              #define ENUM_BASE2(d, x) ((x) << 16)
x                   8 a.c              #define ENUM_BASE2(d, x) ((x) << 16)
ENUM_BASE2          9 a.c              enum { APPLE = ENUM_BASE2(0, FRUIT) };
FRUIT               9 a.c              enum { APPLE = ENUM_BASE2(0, FRUIT) };
ENUM_BASE2         10 a.c              typedef enum { APPLE = ENUM_BASE2(0, 
FRUIT) } FOOD;
FRUIT              10 a.c              typedef enum { APPLE = ENUM_BASE2(0, 
FRUIT) } FOOD;

-- 
Hideki IWAMOTO <[email protected]>

Attachment: 20120217-enumerator_list.patch
Description: Binary data

_______________________________________________
Bug-global mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-global

Reply via email to