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

Reply via email to