Skip to content

Commit 38c046d

Browse files
authored
Merge pull request #3275 from masatake/cpp-null-arg-macrox
Cxx: handle the case passing nothing as a macro argument
2 parents 4c6a120 + 0785b9c commit 38c046d

File tree

4 files changed

+182
-4
lines changed

4 files changed

+182
-4
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
--sort=no
2+
--fields=+n{signature}
3+
--param-CPreProcessor._expand=1
4+
--fields-C={macrodef}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
X input.c /^#define X$/;" d line:1 file: macrodef:
2+
m0 input.c /^#define m0(/;" d line:2 file: signature:(Q,W,E,R) macrodef:int Q
3+
m1 input.c /^#define m1(/;" d line:3 file: signature:(Q,W,E,R) macrodef:int W
4+
m2 input.c /^#define m2(/;" d line:4 file: signature:(Q,W,E,R) macrodef:int E
5+
m3 input.c /^#define m3(/;" d line:5 file: signature:(Q,W,E,R) macrodef:int R
6+
a input.c /^m0(a,b,c,d);$/;" v line:7 typeref:typename:int
7+
a input.c /^m0(a,X,c,d);$/;" v line:8 typeref:typename:int
8+
a input.c /^m0(a,b,X,d);$/;" v line:9 typeref:typename:int
9+
a input.c /^m0(a,b,c,X);$/;" v line:10 typeref:typename:int
10+
a input.c /^m0(a,X,X,d);$/;" v line:11 typeref:typename:int
11+
a input.c /^m0(a,b,X,X);$/;" v line:12 typeref:typename:int
12+
a input.c /^m0(a,X,c,X);$/;" v line:13 typeref:typename:int
13+
a input.c /^m0(a,X,X,X);$/;" v line:14 typeref:typename:int
14+
b input.c /^m1(a,b,c,d);$/;" v line:16 typeref:typename:int
15+
b input.c /^m1(X,b,c,d);$/;" v line:17 typeref:typename:int
16+
b input.c /^m1(a,b,X,d);$/;" v line:18 typeref:typename:int
17+
b input.c /^m1(a,b,c,X);$/;" v line:19 typeref:typename:int
18+
b input.c /^m1(X,b,X,d);$/;" v line:20 typeref:typename:int
19+
b input.c /^m1(a,b,X,X);$/;" v line:21 typeref:typename:int
20+
b input.c /^m1(X,b,c,X);$/;" v line:22 typeref:typename:int
21+
b input.c /^m1(X,b,X,X);$/;" v line:23 typeref:typename:int
22+
c input.c /^m2(a,b,c,d);$/;" v line:25 typeref:typename:int
23+
c input.c /^m2(X,b,c,d);$/;" v line:26 typeref:typename:int
24+
c input.c /^m2(a,X,c,d);$/;" v line:27 typeref:typename:int
25+
c input.c /^m2(a,b,c,X);$/;" v line:28 typeref:typename:int
26+
c input.c /^m2(X,X,c,d);$/;" v line:29 typeref:typename:int
27+
c input.c /^m2(a,X,c,X);$/;" v line:30 typeref:typename:int
28+
c input.c /^m2(X,b,c,X);$/;" v line:31 typeref:typename:int
29+
c input.c /^m2(X,X,c,X);$/;" v line:32 typeref:typename:int
30+
d input.c /^m3(a,b,c,d);$/;" v line:34 typeref:typename:int
31+
d input.c /^m3(X,b,c,d);$/;" v line:35 typeref:typename:int
32+
d input.c /^m3(a,X,c,d);$/;" v line:36 typeref:typename:int
33+
d input.c /^m3(a,b,X,d);$/;" v line:37 typeref:typename:int
34+
d input.c /^m3(X,X,c,d);$/;" v line:38 typeref:typename:int
35+
d input.c /^m3(a,X,X,d);$/;" v line:39 typeref:typename:int
36+
d input.c /^m3(X,b,X,d);$/;" v line:40 typeref:typename:int
37+
d input.c /^m3(X,X,X,d);$/;" v line:41 typeref:typename:int
38+
a input.c /^m0(a,b,c,d);$/;" v line:43 typeref:typename:int
39+
a input.c /^m0(a,,c,d);$/;" v line:44 typeref:typename:int
40+
a input.c /^m0(a,b,,d);$/;" v line:45 typeref:typename:int
41+
a input.c /^m0(a,b,c,);$/;" v line:46 typeref:typename:int
42+
a input.c /^m0(a,,,d);$/;" v line:47 typeref:typename:int
43+
a input.c /^m0(a,b,,);$/;" v line:48 typeref:typename:int
44+
a input.c /^m0(a,,c,);$/;" v line:49 typeref:typename:int
45+
a input.c /^m0(a,,,);$/;" v line:50 typeref:typename:int
46+
b input.c /^m1(a,b,c,d);$/;" v line:52 typeref:typename:int
47+
b input.c /^m1(,b,c,d);$/;" v line:53 typeref:typename:int
48+
b input.c /^m1(a,b,,d);$/;" v line:54 typeref:typename:int
49+
b input.c /^m1(a,b,c,);$/;" v line:55 typeref:typename:int
50+
b input.c /^m1(,b,,d);$/;" v line:56 typeref:typename:int
51+
b input.c /^m1(a,b,,);$/;" v line:57 typeref:typename:int
52+
b input.c /^m1(,b,c,);$/;" v line:58 typeref:typename:int
53+
b input.c /^m1(,b,,);$/;" v line:59 typeref:typename:int
54+
c input.c /^m2(a,b,c,d);$/;" v line:61 typeref:typename:int
55+
c input.c /^m2(,b,c,d);$/;" v line:62 typeref:typename:int
56+
c input.c /^m2(a,,c,d);$/;" v line:63 typeref:typename:int
57+
c input.c /^m2(a,b,c,);$/;" v line:64 typeref:typename:int
58+
c input.c /^m2(,,c,d);$/;" v line:65 typeref:typename:int
59+
c input.c /^m2(a,,c,);$/;" v line:66 typeref:typename:int
60+
c input.c /^m2(,b,c,);$/;" v line:67 typeref:typename:int
61+
c input.c /^m2(,,c,);$/;" v line:68 typeref:typename:int
62+
d input.c /^m3(a,b,c,d);$/;" v line:70 typeref:typename:int
63+
d input.c /^m3(,b,c,d);$/;" v line:71 typeref:typename:int
64+
d input.c /^m3(a,,c,d);$/;" v line:72 typeref:typename:int
65+
d input.c /^m3(a,b,,d);$/;" v line:73 typeref:typename:int
66+
d input.c /^m3(,,c,d);$/;" v line:74 typeref:typename:int
67+
d input.c /^m3(a,,,d);$/;" v line:75 typeref:typename:int
68+
d input.c /^m3(,b,,d);$/;" v line:76 typeref:typename:int
69+
d input.c /^m3(,,,d);$/;" v line:77 typeref:typename:int
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#define X
2+
#define m0(Q,W,E,R) int Q
3+
#define m1(Q,W,E,R) int W
4+
#define m2(Q,W,E,R) int E
5+
#define m3(Q,W,E,R) int R
6+
7+
m0(a,b,c,d);
8+
m0(a,X,c,d);
9+
m0(a,b,X,d);
10+
m0(a,b,c,X);
11+
m0(a,X,X,d);
12+
m0(a,b,X,X);
13+
m0(a,X,c,X);
14+
m0(a,X,X,X);
15+
16+
m1(a,b,c,d);
17+
m1(X,b,c,d);
18+
m1(a,b,X,d);
19+
m1(a,b,c,X);
20+
m1(X,b,X,d);
21+
m1(a,b,X,X);
22+
m1(X,b,c,X);
23+
m1(X,b,X,X);
24+
25+
m2(a,b,c,d);
26+
m2(X,b,c,d);
27+
m2(a,X,c,d);
28+
m2(a,b,c,X);
29+
m2(X,X,c,d);
30+
m2(a,X,c,X);
31+
m2(X,b,c,X);
32+
m2(X,X,c,X);
33+
34+
m3(a,b,c,d);
35+
m3(X,b,c,d);
36+
m3(a,X,c,d);
37+
m3(a,b,X,d);
38+
m3(X,X,c,d);
39+
m3(a,X,X,d);
40+
m3(X,b,X,d);
41+
m3(X,X,X,d);
42+
43+
m0(a,b,c,d);
44+
m0(a,,c,d);
45+
m0(a,b,,d);
46+
m0(a,b,c,);
47+
m0(a,,,d);
48+
m0(a,b,,);
49+
m0(a,,c,);
50+
m0(a,,,);
51+
52+
m1(a,b,c,d);
53+
m1(,b,c,d);
54+
m1(a,b,,d);
55+
m1(a,b,c,);
56+
m1(,b,,d);
57+
m1(a,b,,);
58+
m1(,b,c,);
59+
m1(,b,,);
60+
61+
m2(a,b,c,d);
62+
m2(,b,c,d);
63+
m2(a,,c,d);
64+
m2(a,b,c,);
65+
m2(,,c,d);
66+
m2(a,,c,);
67+
m2(,b,c,);
68+
m2(,,c,);
69+
70+
m3(a,b,c,d);
71+
m3(,b,c,d);
72+
m3(a,,c,d);
73+
m3(a,b,,d);
74+
m3(,,c,d);
75+
m3(a,,,d);
76+
m3(,b,,d);
77+
m3(,,,d);

parsers/cxx/cxx_token_chain.c

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,17 @@ void cxxTokenChainMoveEntryRange(
441441
}
442442
#endif
443443

444+
static CXXToken * cxxTokenCreatePlaceholder(CXXToken * pToken)
445+
{
446+
CXXToken * pPlaceholder = cxxTokenCreate();
447+
448+
pPlaceholder->iLineNumber = pToken->iLineNumber;
449+
pPlaceholder->oFilePosition = pToken->oFilePosition;
450+
pPlaceholder->eType = CXXTokenTypeUnknown;
451+
452+
return pPlaceholder;
453+
}
454+
444455
CXXTokenChain * cxxTokenChainSplitOnComma(CXXTokenChain * tc)
445456
{
446457
if(!tc)
@@ -457,14 +468,31 @@ CXXTokenChain * cxxTokenChainSplitOnComma(CXXTokenChain * tc)
457468

458469
while(pStart && pToken->pNext)
459470
{
460-
while(pToken->pNext && (!cxxTokenTypeIs(pToken->pNext,CXXTokenTypeComma)))
461-
pToken = pToken->pNext;
471+
CXXToken * pNew = NULL;
462472

463-
CXXToken * pNew = cxxTokenChainExtractRange(pStart,pToken,0);
473+
if (cxxTokenTypeIs(pToken,CXXTokenTypeComma))
474+
{
475+
// If nothing is passed as an argument like
476+
//
477+
// macro(,b),
478+
// macro(a,), or
479+
// macro(,)
480+
//
481+
// , we must inject a dummy token to the chain.
482+
pNew = cxxTokenCreatePlaceholder(pToken);
483+
// we will not update pToken in this case.
484+
}
485+
else
486+
{
487+
while(pToken->pNext && (!cxxTokenTypeIs(pToken->pNext,CXXTokenTypeComma)))
488+
pToken = pToken->pNext;
489+
490+
pNew = cxxTokenChainExtractRange(pStart,pToken,0);
491+
pToken = pToken->pNext; // comma or nothing
492+
}
464493
if(pNew)
465494
cxxTokenChainAppend(pRet,pNew);
466495

467-
pToken = pToken->pNext; // comma or nothing
468496
if(pToken)
469497
pToken = pToken->pNext; // after comma
470498
pStart = pToken;

0 commit comments

Comments
 (0)