Skip to content

Commit

Permalink
Split token support (#114)
Browse files Browse the repository at this point in the history
* Split token support

* Defining new structures to store token data

* IPR work on porting to a new tokenization method.

* Actually compiles lol

* Making pretty good progress. Back to trying test cases

* Tokens now get split, and we have new kLAngle and kRAngle token kinds (used by the printer). Next up is token alignment.

* Working reasonably well with new clang patches. Next up is porting Bounds.cpp

* Updated Bounds.cpp code now compiles.

* Progress on split tokens and improved bounds.

* More in-progress work. Trying to track down the source of some non-converted kLess and kGreater.

* Fix segfault. Mitigate issue where control of printing goes from pasta into clang. Eventually solve this properly.

* Improvements to bounds checking. Turn on new option in patched clang.

* Fixes for token provenance

* Bug fix for empty files.

* Bounds improvements

* Add printing support for nested name specifiers

* Fixes a few more bounds issues; disables logging

* Changes to hook the new attribute printer stuff.

* Retain original whitespace and original comments (not from macros though) in the pre-processed files.

* Added some tracking to find directives within the parsed tokens

* Add some APIs for getting from macros back to parsed tokens.

* Adds APIs to get from macros back to parsed tokens.

* Fix split token tracker

* Bug fixes and improvements.

* Bug fixes for macro test cases.

* Bug fixes.

* Simplify API.

* Update to use RemappedDecl

* Add decl contexts to token contexts.

* Add DeclContext::From(decl)

* Bounds improvements.

* Working on bounds, nullables.

* Update after bootstrap. Fiddle with bounds.

* Fix bounds with template type params. Fix UAF with decl printer.

* Disable align and lex debug

* Fix for variable form issue with bounds for function protos.

* Inverted logic

* Adds PrintedTokenRange::AdoptWhitespace. Makes printing of template arguments try to use canonical types.

* Pag/track split token: Redefine methods for finding substitutions that align with tokens (#118)

* Remove print-tokens target from test suite

- Remove the deleted target `print-tokens` from the list of
  dependencies in the `test` directory's CMakeLists
- Remove tool substitutions for `print-tokens` in the LIT Python
  configuration file.

* Redefine methods for finding aligned substitutions

- Redefine the methods `AlignedSubstitutions()`, `NextMacroToken()`, and
  `MacroDerivationChain()` to work with recent changes to `Token` class.

* Return a vector from AlignedParameterSubstitutions

- Change `AlignedParameterSubstitutions()` to return a vector instead of
  a map to preserve the order of macro parameters in the return value.

* Fixes to token alignment, making merging less aggressive.

* Improves pretty printing

* Fix bounds/printer/align issues.

* Fix eof/bof marker assert when there is a -include.

* Pag/track split token: Redefine methods for finding substitutions that align with tokens (#118)

* Remove print-tokens target from test suite

- Remove the deleted target `print-tokens` from the list of
  dependencies in the `test` directory's CMakeLists
- Remove tool substitutions for `print-tokens` in the LIT Python
  configuration file.

* Redefine methods for finding aligned substitutions

- Redefine the methods `AlignedSubstitutions()`, `NextMacroToken()`, and
  `MacroDerivationChain()` to work with recent changes to `Token` class.

* Return a vector from AlignedParameterSubstitutions

- Change `AlignedParameterSubstitutions()` to return a vector instead of
  a map to preserve the order of macro parameters in the return value.

* Bringing back function type locs, at least partially. Might affect bounds in the future, but was really affecting the beginning of functions in C code. Added a fix for musl libc in preprocessor tokens.

* Added recovery mode to token alignment. Fixes in bounds.

* update is interface

* Inject extra whitespace. Fixup bounds.

* Disable bounds on cxxdeductionguides.

* Add null check for BaseType

* Weaken conditions on ExpandRange for FunctionDecls. Needed for lambdas. Make preprocessor output thread-id specific.

* Improvements to bounds to handle lambdas

* Changes some logic in decl/type printing for nested namespace specifiers. Re-bootstraps with by-reference template arguments.

* Don't print attributes from pragmas. Add exclusive upper bound on searches for r_parens when the function has a variable form.

* Take CookedLiteral nullable bootstrap from kumarak/split_token.

* Mark CXXForRangeStmt::Initializer as nullable

* Add nullable.

* Re-bootstrap pasta for nullable methods.

* Change Generator -> Iterator for python schema return type.

* Don't trigger assertion with CXXCtorInitializer::IsBaseVirtual

* Type printing for template specializations and noexcept clauses

* Fix sigsegv

* Merge with pag/track_split_token (#120)

* Fix ellipsis token asset and assert due to parsed token

* Strip BOM from UTF8 and update bootstrap

* Update lexer to handler BOM and update RemoveBOM

* Move HasBOM to FileManager.h

* Bootstrap getVisibility methods

* Fix source range for call expr

* Update Globals.cpp

* Update Stmt.cpp

---------

Co-authored-by: Peter Goodman <peter@trailofbits.com>

* Strips carriage returns from file data, after stripping BOMs. Fiddle with type printing

* Fix pasta wrapper to handle assert in clang

* Update pre-processor flag to clear ImplicitPCHInclude

* Integrate target and aux target features into running of the compile command

* Fix stmt printer to avoid issues due to comments parsing (#121)

* Add ARM builtins.

* Bump vendored llvm-project.

* Integrate patch from Michael Zappa related to nanobind.

* Remove hard-coded path

---------

Co-authored-by: Brent Pappas <pappasbrent@gmail.com>
Co-authored-by: Akshay K <iit.akshay@gmail.com>
  • Loading branch information
3 people authored Apr 5, 2024
1 parent bb065e3 commit e7cf73b
Show file tree
Hide file tree
Showing 74 changed files with 7,495 additions and 3,558 deletions.
5 changes: 4 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ add_library(pasta_compiler STATIC
"lib/AST/Util.h"
"lib/AST/Printer/DeclPrinter.cpp"
"lib/AST/Printer/DeclStmtPrinter.h"
"lib/AST/Printer/NestedNameSpecifier.cpp"
"lib/AST/Printer/Printer.cpp"
"lib/AST/Printer/Printer.h"
"lib/AST/Printer/raw_ostream.h"
Expand All @@ -295,7 +296,8 @@ add_library(pasta_compiler STATIC
"lib/Compile/Job.h"
"lib/Compile/PatchedMacroTracker.h"
"lib/Compile/ParsedFileTracker.h"

"lib/Compile/SplitTokenTracker.h"

"lib/Compile/Builtins.cpp"
"lib/Compile/Command.cpp"
"lib/Compile/Compiler.cpp"
Expand All @@ -306,6 +308,7 @@ add_library(pasta_compiler STATIC
"lib/Compile/PatchedMacroTracker.cpp"
"lib/Compile/Preprocess.cpp"
"lib/Compile/Run.cpp"
"lib/Compile/SplitTokenTracker.cpp"
)


Expand Down
73 changes: 48 additions & 25 deletions bin/BootstrapTypes/DeclareEnums.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ static bool AcceptEnumerator(const std::string &name) {
enumerator_name != "NUM_OVERLOADED_OPERATORS";
}

static std::string RenameEnumerator(const std::string &name) {
static std::string RenameEnumeratorInternal(const std::string &name) {
if (enumerator_name == "eof") {
return "EndOfFile";

Expand All @@ -61,99 +61,99 @@ static std::string RenameEnumerator(const std::string &name) {

} else if (enumerator_name.endswith("less")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 4);
return RenameEnumerator(name) + "Less";
return RenameEnumeratorInternal(name) + "Less";

} else if (enumerator_name.endswith("greater")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 7);
return RenameEnumerator(name) + "Greater";
return RenameEnumeratorInternal(name) + "Greater";

} else if (enumerator_name.endswith("equal")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 5);
return RenameEnumerator(name) + "Equal";
return RenameEnumeratorInternal(name) + "Equal";

} else if (enumerator_name.endswith("pipe")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 4);
return RenameEnumerator(name) + "Pipe";
return RenameEnumeratorInternal(name) + "Pipe";

} else if (enumerator_name.endswith("colon")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 5);
return RenameEnumerator(name)+ "Colon";
return RenameEnumeratorInternal(name)+ "Colon";

} else if (enumerator_name.endswith("plus")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 4);
return RenameEnumerator(name) + "Plus";
return RenameEnumeratorInternal(name) + "Plus";

} else if (enumerator_name.endswith("minus")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 5);
return RenameEnumerator(name) + "Minus";
return RenameEnumeratorInternal(name) + "Minus";

} else if (enumerator_name.endswith("hash")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 4);
return RenameEnumerator(name) + "Hash";
return RenameEnumeratorInternal(name) + "Hash";

} else if (enumerator_name.endswith("amp")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 3);
return RenameEnumerator(name) + "Amp";
return RenameEnumeratorInternal(name) + "Amp";

} else if (enumerator_name.endswith("star")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 4);
return RenameEnumerator(name) + "Star";
return RenameEnumeratorInternal(name) + "Star";

} else if (enumerator_name.endswith("_begin")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 6);
return RenameEnumerator(name) + "Begin";
return RenameEnumeratorInternal(name) + "Begin";

} else if (enumerator_name.endswith("_end")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 4);
return RenameEnumerator(name) + "End";
return RenameEnumeratorInternal(name) + "End";

} else if (enumerator_name.endswith("_size")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 5);
return RenameEnumerator(name) + "Size";
return RenameEnumeratorInternal(name) + "Size";

} else if (enumerator_name.endswith("_alloc")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 6);
return RenameEnumerator(name) + "Alloc";
return RenameEnumeratorInternal(name) + "Alloc";

} else if (enumerator_name.endswith("_Alignas")) {
enumerator_name = enumerator_name.substr(0, enumerator_name.size() - 8);
return RenameEnumerator(name) + "_Alignas";
return RenameEnumeratorInternal(name) + "_Alignas";

} else if (enumerator_name.startswith("kw_")) {
enumerator_name = enumerator_name.substr(3);
return "Keyword" + RenameEnumerator(name);
return "Keyword" + RenameEnumeratorInternal(name);

} else if (enumerator_name.startswith("pp_") && name == "PPKeywordKind") {
enumerator_name = enumerator_name.substr(3);
return RenameEnumerator(name);
return RenameEnumeratorInternal(name);

} else if (enumerator_name.startswith("objc_") && name == "ObjCKeywordKind") {
enumerator_name = enumerator_name.substr(5);
return RenameEnumerator(name);
return RenameEnumeratorInternal(name);

} else if (enumerator_name.startswith("is_")) {
enumerator_name = enumerator_name.substr(3);
return "Is" + RenameEnumerator(name);
return "Is" + RenameEnumeratorInternal(name);

} else if (enumerator_name.startswith("has_")) {
enumerator_name = enumerator_name.substr(4);
return "Has" + RenameEnumerator(name);
return "Has" + RenameEnumeratorInternal(name);

} else if (enumerator_name.startswith("_is_")) {
enumerator_name = enumerator_name.substr(4);
return "_Is" + RenameEnumerator(name);
return "_Is" + RenameEnumeratorInternal(name);

} else if (enumerator_name.startswith("_has_")) {
enumerator_name = enumerator_name.substr(5);
return "_Has" + RenameEnumerator(name);
return "_Has" + RenameEnumeratorInternal(name);

} else if (enumerator_name.startswith("__is_")) {
enumerator_name = enumerator_name.substr(5);
return "__Is" + RenameEnumerator(name);
return "__Is" + RenameEnumeratorInternal(name);

} else if (enumerator_name.startswith("__has_")) {
enumerator_name = enumerator_name.substr(6);
return "__Has" + RenameEnumerator(name);
return "__Has" + RenameEnumeratorInternal(name);

// `CxxName` strips things starting with `end`.
} else if (enumerator_name == "endif") {
Expand All @@ -173,6 +173,24 @@ static std::string RenameEnumerator(const std::string &name) {
return CxxName(enumerator_name);
}

static std::string RenameEnumerator(const std::string &name) {
auto ret = RenameEnumeratorInternal(name);

// `kRBraceToken` -> `kRBrace`.
if (name == "TokenKind") {
if (ret == "RBraceToken") {
return "RBrace";

} else if (ret == "LBraceToken") {
return "LBrace";

} else if (ret == "Hashat") {
return "HashAt";
}
}
return ret;
}

#define PASTA_BEGIN_NAMED_ENUM(enum_name, underlying_type) \
static void DeclareEnum_ ## enum_name(std::ostream &os, std::ostream &os_py) { \
auto enum_name_str = RenameEnum(PASTA_STR(enum_name)); \
Expand Down Expand Up @@ -226,6 +244,11 @@ static std::string RenameEnumerator(const std::string &name) {
if (enum_name_str == "TypeKind") { \
os << " kQualified // Manually added.\n"; \
os_py << "\n .value(\"QUALIFIED\", pasta::TypeKind::kQualified)"; \
} else if (enum_name_str == "TokenKind") { \
os << " kLAngle, // Manually added.\n" \
<< " kRAngle // Manually added.\n"; \
os_py << "\n .value(\"L_ANGLE\", pasta::TokenKind::kLAngle)" \
<< "\n .value(\"R_ANGLE\", pasta::TokenKind::kRAngle)"; \
} \
os << "};\n\n"; \
os_py << ";\n\n"; \
Expand Down
3 changes: 3 additions & 0 deletions bin/BootstrapTypes/GenerateAttrCpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ void GenerateAttrCpp(std::ostream &py_cmake, std::ostream &py_ast) {
<< " kind = new_that.kind; \\\n"
<< " return *this; \\\n"
<< " }\n\n"
<< "#pragma clang diagnostic push\n"
<< "#pragma clang diagnostic ignored \"-Wreturn-type\"\n"
<< "namespace pasta {\n\n";

os << "AttrVisitor::~AttrVisitor(void) {}\n\n"
Expand Down Expand Up @@ -204,5 +206,6 @@ void Register)" << name << "(nb::module_ &m) {\n"

os
<< "} // namespace pasta\n"
<< "#pragma clang diagnostic pop\n"
<< "#endif // PASTA_IN_BOOTSTRAP\n";
}
3 changes: 3 additions & 0 deletions bin/BootstrapTypes/GenerateDeclCpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,8 @@ void GenerateDeclCpp(std::ostream &py_cmake, std::ostream &py_ast) {
<< " u.DeclContext = clang::dyn_cast<clang::derived>(that.u.Decl); \\\n"
<< " return *this; \\\n"
<< " }\n\n"
<< "#pragma clang diagnostic push\n"
<< "#pragma clang diagnostic ignored \"-Wreturn-type\"\n"
<< "namespace pasta {\n"
<< "namespace {\n"
<< "// Return the PASTA `DeclKind` for a Clang `Decl`.\n"
Expand Down Expand Up @@ -421,5 +423,6 @@ void Register)" << name << "(nb::module_ &m) {\n"

os
<< "} // namespace pasta\n"
<< "#pragma clang diagnostic pop\n"
<< "#endif // PASTA_IN_BOOTSTRAP\n";
}
3 changes: 2 additions & 1 deletion bin/BootstrapTypes/GenerateDeclH.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ void GenerateDeclH(void) {
os << "\n"
<< " const ::clang::DeclContext *RawDeclContext(void) const noexcept {\n"
<< " return u.DeclContext;\n"
<< " }\n\n";
<< " }\n\n"
<< " static std::optional<DeclContext> From(const pasta::Decl &);\n\n";

DeclareCppMethods(os, decl_context, gClassIDs[decl_context]);

Expand Down
3 changes: 3 additions & 0 deletions bin/BootstrapTypes/GenerateStmtCpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ void GenerateStmtCpp(std::ostream& py_cmake, std::ostream& py_ast) {
<< " kind = new_that.kind; \\\n"
<< " return *this; \\\n"
<< " }\n\n"
<< "#pragma clang diagnostic push\n"
<< "#pragma clang diagnostic ignored \"-Wreturn-type\"\n"
<< "namespace pasta {\n\n";

os << "StmtVisitor::~StmtVisitor(void) {}\n\n"
Expand Down Expand Up @@ -185,5 +187,6 @@ void Register)" << name << "(nb::module_ &m) {\n"

os
<< "} // namespace pasta\n"
<< "#pragma clang diagnostic pop\n"
<< "#endif // PASTA_IN_BOOTSTRAP\n";
}
3 changes: 3 additions & 0 deletions bin/BootstrapTypes/GenerateTypeCpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ void GenerateTypeCpp(std::ostream &py_cmake, std::ostream &py_ast) {
<< " qualifiers = new_that.qualifiers; \\\n"
<< " return *this; \\\n"
<< " }\n\n"
<< "#pragma clang diagnostic push\n"
<< "#pragma clang diagnostic ignored \"-Wreturn-type\"\n"
<< "namespace pasta {\n\n";

os << "TypeVisitor::~TypeVisitor(void) {}\n\n"
Expand Down Expand Up @@ -192,5 +194,6 @@ void Register)" << name << "(nb::module_ &m) {\n"

os
<< "} // namespace pasta\n"
<< "#pragma clang diagnostic pop\n"
<< "#endif // PASTA_IN_BOOTSTRAP\n";
}
9 changes: 6 additions & 3 deletions bin/BootstrapTypes/Generated.h
Original file line number Diff line number Diff line change
Expand Up @@ -15991,7 +15991,7 @@ PASTA_BEGIN_CLANG_WRAPPER(SubstNonTypeTemplateParmPackExpr, 1704095918)
PASTA_END_BASE_CLASSES(SubstNonTypeTemplateParmPackExpr, 1704095918)
PASTA_BEGIN_METHODS(SubstNonTypeTemplateParmPackExpr, 1704095918)
PASTA_INSTANCE_METHOD_0(SubstNonTypeTemplateParmPackExpr, 1704095918, 0, children, (llvm::iterator_range<clang::ConstStmtIterator>))
PASTA_INSTANCE_METHOD_0(SubstNonTypeTemplateParmPackExpr, 1704095918, 1, getArgumentPack, (clang::TemplateArgument))
PASTA_INSTANCE_METHOD_0(SubstNonTypeTemplateParmPackExpr, 1704095918, 1, getArgumentPack, (const clang::TemplateArgument &))
PASTA_INSTANCE_METHOD_0(SubstNonTypeTemplateParmPackExpr, 1704095918, 2, getAssociatedDecl, (clang::Decl *))
PASTA_INSTANCE_METHOD_0(SubstNonTypeTemplateParmPackExpr, 1704095918, 3, getBeginLoc, (clang::SourceLocation))
PASTA_INSTANCE_METHOD_0(SubstNonTypeTemplateParmPackExpr, 1704095918, 4, getEndLoc, (clang::SourceLocation))
Expand All @@ -16001,6 +16001,7 @@ PASTA_BEGIN_CLANG_WRAPPER(SubstNonTypeTemplateParmPackExpr, 1704095918)
PASTA_END_METHODS(SubstNonTypeTemplateParmPackExpr, 1704095918)
PASTA_BEGIN_FIELDS(SubstNonTypeTemplateParmPackExpr, 1704095918)
PASTA_PRIVATE_INSTANCE_FIELD(SubstNonTypeTemplateParmPackExpr, 1704095918, Arguments, (const clang::TemplateArgument *))
PASTA_PRIVATE_INSTANCE_FIELD(SubstNonTypeTemplateParmPackExpr, 1704095918, AsArgument, (clang::TemplateArgument))
PASTA_PRIVATE_INSTANCE_FIELD(SubstNonTypeTemplateParmPackExpr, 1704095918, AssociatedDecl, (clang::Decl *))
PASTA_PRIVATE_INSTANCE_FIELD(SubstNonTypeTemplateParmPackExpr, 1704095918, Index, (unsigned int))
PASTA_PRIVATE_INSTANCE_FIELD(SubstNonTypeTemplateParmPackExpr, 1704095918, NameLoc, (clang::SourceLocation))
Expand All @@ -16017,7 +16018,7 @@ PASTA_BEGIN_CLANG_WRAPPER(SubstTemplateTypeParmPackType, 132866951)
PASTA_END_BASE_CLASSES(SubstTemplateTypeParmPackType, 132866951)
PASTA_BEGIN_METHODS(SubstTemplateTypeParmPackType, 132866951)
PASTA_INSTANCE_METHOD_0(SubstTemplateTypeParmPackType, 132866951, 0, desugar, (clang::QualType))
PASTA_INSTANCE_METHOD_0(SubstTemplateTypeParmPackType, 132866951, 1, getArgumentPack, (clang::TemplateArgument))
PASTA_INSTANCE_METHOD_0(SubstTemplateTypeParmPackType, 132866951, 1, getArgumentPack, (const clang::TemplateArgument &))
PASTA_INSTANCE_METHOD_0(SubstTemplateTypeParmPackType, 132866951, 2, getAssociatedDecl, (clang::Decl *))
PASTA_INSTANCE_METHOD_0(SubstTemplateTypeParmPackType, 132866951, 3, getFinal, (bool))
PASTA_INSTANCE_METHOD_0(SubstTemplateTypeParmPackType, 132866951, 4, getIdentifier, (clang::IdentifierInfo *))
Expand All @@ -16028,6 +16029,8 @@ PASTA_BEGIN_CLANG_WRAPPER(SubstTemplateTypeParmPackType, 132866951)
PASTA_END_METHODS(SubstTemplateTypeParmPackType, 132866951)
PASTA_BEGIN_FIELDS(SubstTemplateTypeParmPackType, 132866951)
PASTA_PRIVATE_INSTANCE_FIELD(SubstTemplateTypeParmPackType, 132866951, Arguments, (const clang::TemplateArgument *))
PASTA_PRIVATE_INSTANCE_FIELD(SubstTemplateTypeParmPackType, 132866951, AsArgument, (const clang::TemplateArgument *const))
PASTA_PRIVATE_INSTANCE_FIELD(SubstTemplateTypeParmPackType, 132866951, AsArgumentStorage, (char[24]))
PASTA_PRIVATE_INSTANCE_FIELD(SubstTemplateTypeParmPackType, 132866951, AssociatedDeclAndFinal, (llvm::PointerIntPair<clang::Decl *, 1, bool, llvm::PointerLikeTypeTraits<clang::Decl *>, llvm::PointerIntPairInfo<clang::Decl *, 1, llvm::PointerLikeTypeTraits<clang::Decl *>>>))
PASTA_END_FIELDS(SubstTemplateTypeParmPackType, 132866951)
PASTA_BEGIN_CLASS_ENUMS(SubstTemplateTypeParmPackType, 132866951)
Expand Down Expand Up @@ -17689,7 +17692,7 @@ PASTA_BEGIN_CLANG_WRAPPER(UnaryExprOrTypeTraitExpr, 990815640)
PASTA_INSTANCE_METHOD_0(UnaryExprOrTypeTraitExpr, 990815640, 10, isArgumentType, (bool))
PASTA_END_METHODS(UnaryExprOrTypeTraitExpr, 990815640)
PASTA_BEGIN_FIELDS(UnaryExprOrTypeTraitExpr, 990815640)
PASTA_PRIVATE_INSTANCE_FIELD(UnaryExprOrTypeTraitExpr, 990815640, Argument, (clang::UnaryExprOrTypeTraitExpr::(unnamed union at /pasta:287355:3)))
PASTA_PRIVATE_INSTANCE_FIELD(UnaryExprOrTypeTraitExpr, 990815640, Argument, (clang::UnaryExprOrTypeTraitExpr::(unnamed union at /pasta:412357:3)))
PASTA_PRIVATE_INSTANCE_FIELD(UnaryExprOrTypeTraitExpr, 990815640, OpLoc, (clang::SourceLocation))
PASTA_PRIVATE_INSTANCE_FIELD(UnaryExprOrTypeTraitExpr, 990815640, RParenLoc, (clang::SourceLocation))
PASTA_END_FIELDS(UnaryExprOrTypeTraitExpr, 990815640)
Expand Down
Loading

0 comments on commit e7cf73b

Please sign in to comment.