On 6/12/2014 10:40, Shigio YAMAGUCHI wrote:
> I'm very sorry for my making many requests. But, ... just one more.
I'm very sorry you've had to.
> New parser ignores some symbols which are not definition.
Fixed, and referenced forward declarations and specs (this patch is based on
the previous one). There'll be a problem if you use relational or shift
operators within a template instantiation, but I'm guessing that's unlikely.
C:\test>cat -n test.cc
1 a() {
2 struct menu *menu = NULL;
3
4 connect(configList, SIGNAL(menuSelected(struct menu *)),
5 SLOT(changeMenu(struct menu *)));
6 }
7
8 struct S1 <int, SR1, SR2, float> {
9 int m1;
10 };
11
12 struct S2 : SR3 {
13 float m2;
14 };
15
16 template struct SR4<int>;
17
18 class {};
19 class CR1;
20 class EXTERN CR2;
21 class C1 {};
22 class IMPORT C2 {};
23 class
24 {};
25 class
26 C3 {};
27 class
28 C4
29 {};
30 class
31 EXPORT
32 C5
33 {};
C:\test>gtags
C:\test>global -x .*
C1 21 test.cc class C1 {};
C2 22 test.cc class IMPORT C2 {};
C3 26 test.cc C3 {};
C4 28 test.cc C4
C5 32 test.cc C5
S1 8 test.cc struct S1 <int, SR1, SR2, float> {
S2 12 test.cc struct S2 : SR3 {
a 1 test.cc a() {
C:\test>global -xrs .*
CR1 19 test.cc class CR1;
CR2 20 test.cc class EXTERN CR2;
EXPORT 31 test.cc EXPORT
EXTERN 20 test.cc class EXTERN CR2;
IMPORT 22 test.cc class IMPORT C2 {};
NULL 2 test.cc struct menu *menu = NULL;
SIGNAL 4 test.cc connect(configList,
SIGNAL(menuSelected(struct menu *)),
SLOT 5 test.cc SLOT(changeMenu(struct menu
*)));
SR1 8 test.cc struct S1 <int, SR1, SR2, float> {
SR2 8 test.cc struct S1 <int, SR1, SR2, float> {
SR3 12 test.cc struct S2 : SR3 {
SR4 16 test.cc template struct SR4<int>;
changeMenu 5 test.cc SLOT(changeMenu(struct menu
*)));
configList 4 test.cc connect(configList,
SIGNAL(menuSelected(struct menu *)),
connect 4 test.cc connect(configList,
SIGNAL(menuSelected(struct menu *)),
m1 9 test.cc int m1;
m2 13 test.cc float m2;
menu 2 test.cc struct menu *menu = NULL;
menu 4 test.cc connect(configList,
SIGNAL(menuSelected(struct menu *)),
menu 5 test.cc SLOT(changeMenu(struct menu
*)));
menuSelected 4 test.cc connect(configList,
SIGNAL(menuSelected(struct menu *)),
--
Jason.
diff -urp global-6.3.3/libparser/Cpp.c global-6.3-3/libparser/Cpp.c
--- global-6.3.3/libparser/Cpp.c 2014-12-07 11:49:33 +1000
+++ global-6.3-3/libparser/Cpp.c 2014-12-07 11:18:41 +1000
@@ -79,8 +79,7 @@ Cpp(const struct parser_param *param)
char *terminate;
int level;
} stack[MAXCLASSSTACK];
- const char *interested_class = "<:{}=;~";
- const char *interested = interested_class + 2;
+ const char *interested = "{}=;~";
STRBUF *sb = strbuf_open(0);
*classname = *completename = 0;
@@ -186,7 +185,7 @@ Cpp(const struct parser_param *param)
case CPP_STRUCT:
case CPP_CLASS:
DBG_PRINT(level, cc == CPP_CLASS ? "class" : "struct");
- while ((c = nexttoken(interested_class,
cpp_reserved_word)) == CPP___ATTRIBUTE__ || c == '\n')
+ while ((c = nexttoken(NULL, cpp_reserved_word)) ==
CPP___ATTRIBUTE__ || c == '\n')
if (c == CPP___ATTRIBUTE__)
process_attribute(param);
if (c == SYMBOL) {
@@ -200,20 +199,33 @@ Cpp(const struct parser_param *param)
saveline = strbuf_value(sb);
strlimcpy(classname, token,
sizeof(classname));
}
- c = nexttoken(interested_class,
cpp_reserved_word);
+ c = nexttoken(NULL, cpp_reserved_word);
+ if (c == SYMBOL)
+ PUT(PARSER_REF_SYM, classname,
savelineno, saveline);
+ else if (c == '<') {
+ int templates = 1;
+ for (;;) {
+ c = nexttoken(NULL,
cpp_reserved_word);
+ if (c == SYMBOL)
+
PUT(PARSER_REF_SYM, token, lineno, sp);
+ else if (c == '<')
+ ++templates;
+ else if (c == '>') {
+ if (--templates
== 0)
+ break;
+ } else if (c == EOF)
+ die("failed to
parse template [+%d %s].", savelineno, curfile);
+ }
+ c = nexttoken(NULL,
cpp_reserved_word);
+ }
} while (c == SYMBOL || c == '\n');
- /*
- * Ignore forward definitions.
- * "class name;"
- */
- if (c == '<' || c == ':' || c == '{') /* } */ {
+ if (c == ':' || c == '{') /* } */ {
startclass = 1;
PUT(PARSER_DEF, classname, savelineno,
saveline);
- } else if (c != ';')
+ } else
PUT(PARSER_REF_SYM, classname,
savelineno, saveline);
}
- if (c != '<' && c != ':')
- pushbacktoken();
+ pushbacktoken();
break;
case '{': /* } */
DBG_PRINT(level, "{"); /* } */
_______________________________________________
Bug-global mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-global