bug-global
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] pick up symbols in enumerator-list more correctly


From: Hideki IWAMOTO
Subject: [PATCH] pick up symbols in enumerator-list more correctly
Date: Fri, 17 Feb 2012 23:42:22 +0900

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 <address@hidden>

Attachment: 20120217-enumerator_list.patch
Description: Binary data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]