1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
Index: cint/cint/src/typedef.cxx
===================================================================
--- cint/cint/src/typedef.cxx (revision 42564)
+++ cint/cint/src/typedef.cxx (revision 42566)
@@ -297,18 +297,27 @@
}
c = G__fgetname_template(type1, 0, "{");
}
- if (!strcmp(type1, "::")) { // FIXME: This makes no sense, there cannot be typedef ::{...};
+ if (!strcmp(type1, "::")) {
// skip a :: without a namespace in front of it (i.e. global namespace!)
c = G__fgetspace(); // skip the next ':'
c = G__fgetname_template(type1, 0, "{");
}
- if (!strncmp(type1, "::", 2)) { // Strip a leading :: (global namespace operator)
- // A leading '::' causes other typename matching functions to fail so
- // we remove it. This is not the ideal solution (neither was the one
- // above since it does not allow for distinction between global
- // namespace and local namespace) ... but at least it is an improvement
- // over the current behavior.
- strcpy((char*)type1, type1 + 2); // Okay since we reduce the size ...
+ if (!strncmp(type1, "::", 2)) {
+ // Strip a leading :: (global namespace operator).
+ // A leading '::' causes other typename matching
+ // functions to fail so we remove it. This is not
+ // the ideal solution (neither is the one above)
+ // since it does not allow for decriminating between
+ // global namespace and local namespace, but at
+ // least it is an improvement over the current
+ // behavior.
+ //
+ // Note: We must use memmove because the source
+ // and destination strings overlap!
+ //
+ int t1len = strlen(type1);
+ memmove(type1, type1 + 2, t1len - 2);
+ type1.Set(t1len - 2, '\0');
}
while (isspace(c)) {
len = strlen(type1);
|