Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Clang] Fix __VA_OPT__ implementation so that it treats the concatena…
…tion of a non-placemaker token and placemaker token as a non-placemaker token Currently the implementation of __VA_OPT__ will treat the concatenation of a non-placemaker token and placemaker token as a placemaker token which is not correct. This will fix the implementation and treat the result as a non-placemaker token. This fixes: #60268 Differential Revision: https://reviews.llvm.org/D142604
- Loading branch information
Showing
3 changed files
with
41 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,30 +1,36 @@ | ||
RUN: %clang_cc1 -E %s -pedantic -std=c++2a | FileCheck -strict-whitespace %s | ||
|
||
#define LPAREN() ( | ||
#define G(Q) 42 | ||
#define F1(R, X, ...) __VA_OPT__(G R X) ) | ||
1: int x = F1(LPAREN(), 0, <:-); | ||
// CHECK: 1: int x = 42; | ||
|
||
#define F2(...) f(0 __VA_OPT__(,) __VA_ARGS__) | ||
#define EMP | ||
2: F2(EMP) | ||
// CHECK: 2: f(0 ) | ||
|
||
#define H3(X, ...) #__VA_OPT__(X##X X##X) | ||
3: H3(, 0) | ||
// CHECK: 3: "" | ||
|
||
#define H4(X, ...) __VA_OPT__(a X ## X) ## b | ||
4: H4(, 1) | ||
// CHECK: 4: a b | ||
|
||
#define H4B(X, ...) a ## __VA_OPT__(X ## X b) | ||
4B: H4B(, 1) | ||
// CHECK: 4B: a b | ||
|
||
#define H5A(...) __VA_OPT__()/**/__VA_OPT__() | ||
#define H5B(X) a ## X ## b | ||
#define H5C(X) H5B(X) | ||
5: H5C(H5A()) | ||
// CHECK: 5: ab | ||
RUN: %clang_cc1 -E %s -pedantic -std=c++2a | FileCheck -strict-whitespace %s | ||
|
||
#define LPAREN() ( | ||
#define G(Q) 42 | ||
#define F1(R, X, ...) __VA_OPT__(G R X) ) | ||
1: int x = F1(LPAREN(), 0, <:-); | ||
// CHECK: 1: int x = 42; | ||
|
||
#define F2(...) f(0 __VA_OPT__(,) __VA_ARGS__) | ||
#define EMP | ||
2: F2(EMP) | ||
// CHECK: 2: f(0 ) | ||
|
||
#define H3(X, ...) #__VA_OPT__(X##X X##X) | ||
3: H3(, 0) | ||
// CHECK: 3: "" | ||
|
||
#define H4(X, ...) __VA_OPT__(a X ## X) ## b | ||
4: H4(, 1) | ||
// CHECK: 4: a b | ||
|
||
#define H4B(X, ...) a ## __VA_OPT__(X ## X b) | ||
4B: H4B(, 1) | ||
// CHECK: 4B: a b | ||
|
||
#define H5A(...) __VA_OPT__()/**/__VA_OPT__() | ||
#define H5B(X) a ## X ## b | ||
#define H5C(X) H5B(X) | ||
5: H5C(H5A()) | ||
// CHECK: 5: ab | ||
|
||
namespace GH60268 { | ||
#define H6(X, ...) __VA_OPT__(a ## X) ## b | ||
6: H6(, 1); | ||
// CHECK: 6: ab | ||
} |