[FCP] copy facebook-clang-plugins files [2/N]

Summary:
Copy files from (clean commit) FCP [024a101](024a101228) repo to folder in infer repo (i.e. no longer a subrepo).

Excluding all dotfiles except .gitingnore and .clang-format

```
$ git checkout https://github.com/facebook/facebook-clang-plugins.git
$ mkdir ~/infer/facebook-clang-plugins
$ cp -r facebook-clang-plugins/* ~/infer/facebook-clang-plugins/

Reviewed By: ngorogiannis

Differential Revision: D23315608

fbshipit-source-id: 2fc38b25e
master
Martin Trojer 4 years ago committed by Facebook GitHub Bot
parent a7dee1edc3
commit 0ded7805c2

@ -0,0 +1,46 @@
---
AccessModifierOffset: -1
AlignEscapedNewlinesLeft: true
AlignTrailingComments: false
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: true
BinPackArguments: false
BinPackParameters: false
BreakBeforeBinaryOperators: false
BreakBeforeBraces: Attach
BreakConstructorInitializersBeforeComma: false
ColumnLimit: 80
CommentPragmas: '^@atd'
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
ExperimentalAutoDetectBinPacking: true
IndentCaseLabels: false
IndentFunctionDeclarationAfterType: false
IndentWidth: 2
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCSpaceBeforeProtocolList: false
PenaltyBreakBeforeFirstCallParameter: 10
PenaltyBreakComment: 60
PenaltyBreakFirstLessLess: 20
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Right
SpaceAfterControlStatementKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
Standard: Cpp11
TabWidth: 8
UseTab: Never
...

@ -0,0 +1,6 @@
build
clang-ocaml/.depend
xcode/*
*~
clang/install
clang/installed.version

@ -0,0 +1,3 @@
# Code of Conduct
Facebook has adopted a Code of Conduct that we expect project participants to adhere to. Please [read the full text](https://code.facebook.com/codeofconduct) so that you can understand what actions will and will not be tolerated.

@ -0,0 +1,41 @@
# Contributing to facebook-clang-plugins
We want to make contributing to this project as easy and transparent as
possible.
## Code of Conduct
The code of conduct is described in [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md).
## Our Development Process
The github repository https://github.com/facebook/facebook-clang-plugins is the source of truth.
## Pull Requests
We actively welcome your pull requests.
1. Fork the repo and create your branch from `master`.
2. If you've added code that should be tested, add tests
3. If you've changed APIs, update the documentation.
4. Ensure the test suite passes.
Run tests with `make -C libtooling test`. For re-recording the tests, run `make -C libtooling record-test-outputs`.
5. If you haven't already, complete the Contributor License Agreement ("CLA").
## Contributor License Agreement ("CLA")
In order to accept your pull request, we need you to submit a CLA. You only need
to do this once to work on any of Facebook's open source projects.
Complete your CLA here: <https://developers.facebook.com/opensource/cla>
## Issues
We use GitHub issues to track public bugs. Please ensure your description is
clear and has sufficient instructions to be able to reproduce the issue.
Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe
disclosure of security bugs. In those cases, please go through the process
outlined on that page and do not file a public issue.
## Coding Style
Please use the LLVM style for new code: http://llvm.org/docs/CodingStandards.html
while we are (slowly) updating the rest of the files.
## License
By contributing to facebook-clang-plugins, you agree that your contributions will be licensed
under its MIT license.

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2014-present, Facebook, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -0,0 +1,43 @@
==============================================================================
LLVM Release License
==============================================================================
University of Illinois/NCSA
Open Source License
Copyright (c) 2003-2014 University of Illinois at Urbana-Champaign.
All rights reserved.
Developed by:
LLVM Team
University of Illinois at Urbana-Champaign
http://llvm.org
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal with
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimers.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimers in the
documentation and/or other materials provided with the distribution.
* Neither the names of the LLVM Team, University of Illinois at
Urbana-Champaign, nor the names of its contributors may be used to
endorse or promote products derived from this Software without specific
prior written permission.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
SOFTWARE.

@ -0,0 +1,42 @@
# Copyright (c) 2014-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
LEVEL=.
include Makefile.common
.PHONY: all
all:
$(MAKE) -C libtooling/atdlib all
$(MAKE) -C libtooling all
.PHONY: test
test: all
$(MAKE) -C libtooling/atdlib test
$(MAKE) -C libtooling test
.PHONY: clean
clean:
$(MAKE) -C libtooling/atdlib clean
$(MAKE) -C libtooling clean
.PHONY: fmt_all
fmt_all:
find libtooling \
\( -name '*'.cpp -or -name '*'.h -or -name '*'.c -or -name '*'.m -or -name '*'.mm \) \
-exec ./clang/install/bin/clang-format -verbose -i \{\} \+
CHECKCOPYRIGHT=../infer/bin/checkCopyright
.PHONY: copyright
copyright:
@[ -x $(CHECKCOPYRIGHT) ] || { \
echo "only works when this repo is checked out as a git submodule inside the infer repo" >&2; \
echo "make sure this is the case and that `make checkCopyright` has been run from within infer" >&2; \
exit 1; \
}
git ls-files \
| grep -e '\(\.\(atd\|c\|cpp\|h\|m\|ml\|mli\|mm\|py\|sh\)\(\|\.p\)$$\|^\(.*/\|\)Makefile\)' \
| grep -v 'libtooling/ASTExporter\.\(cpp\|h\)' \
| xargs $(CHECKCOPYRIGHT) -i

@ -0,0 +1,66 @@
# Copyright (c) 2014-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
include $(LEVEL)/Makefile.config
# Typical compilation flags for Objective C examples
ifeq ($(HAS_OBJC),yes)
IOSFLAGS=-isysroot $(SDKPATH) -mios-simulator-version-min=8.2 -target x86_64-apple-darwin14 -fobjc-arc \
-Wno-unused-command-line-argument \
-Wno-objc-property-implementation
endif
# we assume that the targeted clang was configured with --enable-libcpp --enable-cxx14
CFLAGS_Darwin+=-stdlib=libc++ -std=c++14
LDFLAGS_Darwin+=-stdlib=libc++
CFLAGS_Linux+=-std=c++14 -fPIC
LDFLAGS_Linux+=
override CFLAGS+=$(CFLAGS_$(shell uname)) -g
override LDFLAGS+=$(LDFLAGS_$(shell uname))
override CFLAGS+=$(CLANG_INCLUDES:%=-I%) -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fno-common -Woverloaded-virtual -Wcast-qual -fno-strict-aliasing -pedantic -Wno-long-long -Wall -W -Wno-unused-parameter -Wwrite-strings -Wno-uninitialized -Wno-missing-field-initializers -Wno-vla-extension -Wno-c99-extensions
ifdef DEBUG
override CFLAGS+=-DDEBUG
export VERBOSE:=1
SHELL=bash -O nullglob
else
override CFLAGS+=-O3 -DNDEBUG
override LDFLAGS+=-O3
# early exit when tests fail
SHELL=bash -e -O nullglob
endif
# project headers (if any)
HEADERS?=
# test runner
RUNTEST=$(LEVEL)/scripts/run_test.sh
LDFLAGS_DYLIB=$(LDFLAGS)
LDFLAGS_DYLIB+=-Wl,-rpath -Wl,@executable_path/../lib -Wl,-undefined,dynamic_lookup -Wl,-flat_namespace -Wl,-undefined,suppress -dynamiclib -shared
CLANG_TOOL_LIBS := \
-lclangFrontend \
-lclangIndex \
-lclangSerialization \
-lclangDriver \
-lclangTooling \
-lclangCodeGen \
-lclangParse \
-lclangSema \
-lclangAnalysis \
-lclangRewriteFrontend \
-lclangRewrite \
-lclangEdit \
-lclangAST \
-lclangLex \
-lclangBasic
# Local Variables:
# mode: makefile
# End:

@ -0,0 +1,49 @@
# Copyright (c) 2014-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
# Template configuration file for make.
# You may use $(LEVEL) to refer to the directory containing this file.
# --- targeted clang compiler ----
# Where to find clang installation directories
CLANG_PREFIX?=$(LEVEL)/clang/install
# Where to find clang headers (possibly a list, see below)
CLANG_INCLUDES?=$(CLANG_PREFIX)/include
# example of alternative paths to compile and load the plugin into a locally compiled, not yet installed llvm/clang
#CLANG_PREFIX=llvm-build/Debug+Asserts
#CLANG_INCLUDES=llvm/tools/clang/include llvm-build/tools/clang/include llvm-build/include llvm/include
# target compiler, must match the exact same version of clang as the include files
CLANG?=$(CLANG_PREFIX)/bin/clang
LLVM_CXXFLAGS?=`$(CLANG_PREFIX)/bin/llvm-config --cxxflags 2>/dev/null || true`
LLVM_LDFLAGS?=`$(CLANG_PREFIX)/bin/llvm-config --ldflags --libs --system-libs 2>/dev/null || true`
# --- local clang compiler ---
# Which compiler to use to compile the plugin themselves.
LOCAL_CLANG?=clang
CC=$(LOCAL_CLANG)
CXX=$(LOCAL_CLANG)++
# Which preprocessor to use to extract ATD comments from cpp files.
# @requires clang >= 3.4 (The nonstandard part here is that we want to expand doc-comments contained in macros.)
ATD_CPP?=$(LOCAL_CLANG) -cc1 -E -traditional-cpp -w -P -main-file-name - -o -
# Which preprocessor to use on ocaml "pre-source" files.
OCAML_CPP?=$(LOCAL_CLANG) -cc1 -E -P -x c -main-file-name - -o -
# --- Objective C ---
# Which SDK to use (if any)
SDKPATH?=$(shell ls -d "`xcode-select --print-path 2> /dev/null`"/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator*.sdk 2> /dev/null | sort -r | head -n 1 || true)
ifeq ($(SDKPATH),)
HAS_OBJC=no
else
HAS_OBJC=yes
endif

@ -0,0 +1,8 @@
# Copyright (c) 2014-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
build/%.o: %.cpp $(HEADERS) $(CLANG)
@mkdir -p $$(dirname $@)
$(CXX) $(CFLAGS) -c $< -o $@

@ -0,0 +1,42 @@
Facebook Clang Plugins
======================
This [repository](https://github.com/facebook/facebook-clang-plugins) aims to share some useful clang plugins developed at Facebook. They are mostly used by [infer](https://github.com/facebook/infer).
It contains frontend plugins to the [clang compiler](http://clang.llvm.org/) to process the syntax of source files directly to accomplish more general tasks; specifically, we have developed a clang-to-ocaml bridge to make code analyses easier.
Structure of the repository
---------------------------
- [`libtooling`](https://github.com/facebook/facebook-clang-plugins/tree/master/libtooling) : frontend plugins (currently a clang-to-json AST exporter),
- [`clang-ocaml`](https://github.com/facebook/facebook-clang-plugins/tree/master/clang-ocaml) : OCaml libraries to process the JSON output of frontend plugins,
Quick start
-----------
The current version of the plugins requires recent version of the clang compiler, re-compiled from source. Clang source which is used by this project can be found in `clang/src/`
General instructions to compile clang can be found here: http://clang.llvm.org/get_started.html
To compile and use the required version of clang, please run ./clang/setup.sh.
Using this script should make the variable CLANG_PREFIX unnecessary to compile the plugin.
Caveat:
- Because of the nature of C++, clang and the plugins need to be compiled with the exact same C++ libraries.
- Also, the default stripping command of clang in release mode breaks plugins.
Once the target compiler is installed, `make test` should run the unit tests.
OCaml users may also run:
```
make -C clang-ocaml test #requires proper ocaml libraries, see included clang-ocaml/README
```
Additional configuration options are available in `Makefile.config`.
Licence
-------
The plugins are MIT-licensed.

@ -0,0 +1,162 @@
# Copyright (c) 2014-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
.PHONY: all clean test
LEVEL=..
include $(LEVEL)/Makefile.common
LIBTOOLING=$(LEVEL)/libtooling
ATDLIB=$(LEVEL)/libtooling/atdlib
# see README for the required versions
ATDGEN=atdgen
ATDCAT=atdcat -i
OCAMLOPT=ocamlfind ocamlopt -package unix,atdgen,atdgen-runtime,camlzip -I build -safe-string
all: build/clang_ast_converter build/clang_ast_named_decl_printer
# type definitions
%_t.ml %_t.mli: %.atd
$(ATDGEN) -t -o $* $<
# yojson
%_j.ml %_j.mli: %.atd
$(ATDGEN) -j -o $* $<
# biniou
%_b.ml %_b.mli: %.atd
$(ATDGEN) -b -o $* $<
# validator
%_v.ml %_v.mli: %.atd
$(ATDGEN) -v -o $* $<
# standard ocaml rules
build/%.cmx:%.ml
$(OCAMLOPT) -o $@ -c $<
build/%.cmi:%.mli
$(OCAMLOPT) -o $@ -c $<
build/%.cmx:build/%.ml
$(OCAMLOPT) -o $@ -c $<
build/%.cmi:build/%.mli
$(OCAMLOPT) -o $@ -c $<
# clang AST
build/ast_inline.atd.p: $(LIBTOOLING)/ASTExporter.h
@mkdir -p build
@$(MAKE) -C $(LIBTOOLING) build/ASTExporter.h.p
$(ATDLIB)/extract_atd_from_cpp.py $(LIBTOOLING)/build/ASTExporter.h.p | $(ATDLIB)/normalize_names_in_atd.py > $@
build/ast_inline.atd: build/ast_inline.atd.p
$(ATD_CPP) $< > $@
build/clang_ast.atd: build/ast_inline.atd
# $(ATDCAT) returns 0 even if it fails - look at the output file to
# determine whether it failed or not. Then remove the result file as
# make misteriously doesn't do that by itself
$(ATDCAT) $< > $@ && { [ -s $@ ] || { rm $@; exit 1; }; }
build/ast_inline.atd.inc: build/ast_inline.atd.p
cat $< | grep '^#' > $@
build/ast_inline.pat.inc: build/ast_inline.atd.inc
cat $< | sed 's/*/,/g; s/ list/_list/g' > $@
build/clang_ast_proj.mli: clang_ast_proj.mli.p build/ast_inline.atd.inc
cat $< | $(ATD_CPP) -include build/ast_inline.atd.inc > $@
build/clang_ast_proj.ml: clang_ast_proj.ml.p build/ast_inline.pat.inc
$(OCAML_CPP) -I$(CLANG_PREFIX)/include $< -o - | $(ATDLIB)/normalize_names_in_atd.py | $(ATD_CPP) -include build/ast_inline.pat.inc > $@
# test files except for Objective-C
TEST_FILES_COMMON=c_attributes.c bind_temporary.cpp \
c_cast.cpp const_cast.cpp dynamic_cast.cpp expr_with_cleanups.cpp inheritance.cpp \
lambda.cpp materialize_temporary.cpp namespace_decl.cpp new.cpp struct.cpp this.cpp \
unresolved_lookup.cpp using_directive.cpp class_template.cpp function_template.cpp \
type_trait.cpp no_except_expr.cpp friend.cpp
TEST_FILES=$(TEST_FILES_COMMON)
# only add Objective-C(++) files on mac
ifeq ($(HAS_OBJC),yes)
TEST_FILES+=Hello.m ObjCTest.m ObjCBridgeTransferTest.m objcpp_template_unboxing.mm
endif
PRINTER_TEST_FILES=$(TEST_FILES)
CONVERTER_TEST_FILE=struct.cpp
YOJSON_VALIDATOR_TEST_FILE=$(TEST_FILES)
# simple library for composing unix processes
build/process_test: build/process.cmx build/process_test.cmx
$(OCAMLOPT) -linkpkg -o $@ $^
# Utilities
build/utils_test: build/process.cmx build/utils.cmx build/utils_test.cmx
$(OCAMLOPT) -linkpkg -o $@ $^
CLANG_AST_LIBS=$(patsubst %,build/%.cmx,clang_ast_types clang_ast_t clang_ast_j process utils yojson_utils)
build/yojson_utils_test: $(CLANG_AST_LIBS) build/yojson_utils_test.cmx
$(OCAMLOPT) -linkpkg -o $@ $^
build/clang_ast_proj_test: $(CLANG_AST_LIBS) build/clang_ast_proj.cmx build/clang_ast_proj_test.cmx
$(OCAMLOPT) -linkpkg -o $@ $^
# AST format converter
build/clang_ast_converter: $(CLANG_AST_LIBS) build/clang_ast_converter.cmx
$(OCAMLOPT) -linkpkg -o $@ $^
CLANG_AST_PROJ_LIBS=$(patsubst %,build/%.cmx,clang_ast_types clang_ast_t clang_ast_j clang_ast_proj clang_ast_visit clang_ast_v clang_ast_main)
# example of AST visitor
build/clang_ast_named_decl_printer: $(CLANG_AST_PROJ_LIBS) build/clang_ast_named_decl_printer.cmx
$(OCAMLOPT) -linkpkg -o $@ $^
build/clang_ast_main_test: $(CLANG_AST_PROJ_LIBS) build/clang_ast_main_test.cmx
$(OCAMLOPT) -linkpkg -o $@ $^
test: $(patsubst %,build/%,process_test utils_test yojson_utils_test clang_ast_proj_test clang_ast_converter clang_ast_named_decl_printer clang_ast_main_test)
@$(MAKE) -C $(LIBTOOLING) $(PRINTER_TEST_FILES:%=build/ast_samples/%.yjson) $(TEST_FILES:%=build/ast_samples/%.yjson.gz) $(CONVERTER_TEST_FILE:%=build/ast_samples/%.yjson)
@export LIMIT=100; \
$(RUNTEST) tests/process_test build/process_test; \
$(RUNTEST) tests/utils_test build/utils_test; \
$(RUNTEST) tests/yojson_utils_test build/yojson_utils_test; \
$(RUNTEST) tests/clang_ast_proj_test build/clang_ast_proj_test; \
if [ "$(HAS_OBJC)" = "yes" ]; then \
$(RUNTEST) tests/clang_ast_named_decl_printer build/clang_ast_named_decl_printer $(PRINTER_TEST_FILES:%=$(LIBTOOLING)/build/ast_samples/%.yjson); \
else \
printf "[~] %s skipped (no Objective-C support)\n" clang_ast_named_decl_printer; \
fi; \
$(RUNTEST) tests/clang_ast_converter build/clang_ast_converter --pretty $(CONVERTER_TEST_FILE:%=$(LIBTOOLING)/build/ast_samples/%.yjson); \
$(RUNTEST) tests/clang_ast_yojson_validation ./yojson_validator.sh build/clang_ast_converter $(YOJSON_VALIDATOR_TEST_FILE:%=$(LIBTOOLING)/build/ast_samples/%.yjson.gz); \
if [ "$(HAS_OBJC)" = "yes" ]; then \
$(RUNTEST) tests/clang_ast_main_test build/clang_ast_main_test $(PRINTER_TEST_FILES:%=$(LIBTOOLING)/build/ast_samples/%.yjson); \
else \
printf "[~] %s skipped (no Objective-C support)\n" clang_ast_main_test; \
fi
@if [ ! $$KEEP_TEST_OUTPUTS ]; then rm -f tests/*.out; fi
record-test-outputs:
@rm -f tests/*.out
@$(MAKE) DEBUG=1 KEEP_TEST_OUTPUTS=1 test || true
@for F in tests/*.out; do cp $$F $${F%.out}.exp; done
@rm -f tests/*.out
.PHONY: fmt
fmt:
ocamlformat -i $(wildcard *.ml) $(wildcard *.mli)
-include .depend
.depend: $(wildcard *.ml) $(wildcard *.mli) build/clang_ast_t.mli build/clang_ast_t.ml build/clang_ast_j.mli build/clang_ast_j.ml build/clang_ast_v.mli build/clang_ast_v.ml build/clang_ast_proj.mli build/clang_ast_proj.ml
ocamldep -native -I build $^ | sed -e 's/\([a-zA-Z0-9_]*\.cm.\)/build\/\1/g' | sed -e 's/build\/build\//build\//g' > .depend
clean:
rm -rf tests/*.out build .depend

@ -0,0 +1,95 @@
# Ocaml frontend to the Clang AST
Additional requirements:
- ocaml >= 4.02
- camlzip
- yojson
- atd >= 1.1.2
- atdgen >= 2.0.0
The simplest way to install these dependencies is
1) to install ocaml and opam using your system package manager (e.g. homebrew on MAC OS).
2) run 'opam install camlzip yojson atd atdgen'
Assuming that the current dir is the root of the git repository and CLANG_PREFIX=/usr/local, you may compile and run tests with
```
export CLANG_PREFIX=/usr/local
make -C clang-ocaml depend
make -C clang-ocaml test
```
## API details
The precise AST datatype is described using the "ATD" language. To view the generated ATD file, run `make all` in this directory and then open `build/clang_ast.atd`. That should be enough to get started.
The sections below describe extra functionality for visiting and manipulating the AST from OCaml.
### Autogenerated utility functions
The `Clang_ast_proj` module provides utility functions for AST nodes. Its implementation is autogenerated from the header files provided by the current version of clang. Always prefer to use utility functions from this module vs writing them manually.
Refer to [clang_ast_proj.mli.p](clang_ast_proj.mli.p) for a list of currently available functions.
### Visitors
The `Clang_ast_visit` module provides hooks to be run on AST nodes. Currently there is support for visitors in `Decl`, `Stmt`, `Type` and `SourceLocation` nodes. Here is basic example, that prints kinds of all decl and stmt nodes:
```OCaml
let print_decl _ decl =
prerr (Clang_ast_proj.get_decl_kind_string decl)
let print_stmt _ stmt =
prerr (Clang_ast_proj.get_stmt_kind_string decl)
let print_ast decl =
Clang_ast_visit.decl_visitor := print_decl;
Clang_ast_visit.stmt_visitor := print_stmt;
ignore (Clang_ast_v.validate_decl [] decl)
```
See [`clang_ast_main.ml`](clang_ast_main.ml) for an example of how to use this mechanism to produce maps from node pointers to the nodes they refer to. See `Clang_ast_main.visit_ast` for an example wrapper that provides a convenient API to the `Clang_ast_visit` module.
See [`clang_ast_visit.ml`](clang_ast_visit.ml) for the current list of nodes that support custom visitors.
For more examples of custom visitors, see [`clang_ast_main_test.ml`](clang_ast_main_test.ml).
### Extending types from AST
It's possible to extend existing OCaml variant types in the AST structure with more variants. Currently, `type_ptr` is the only type that allows it. It's achieved via an [OCaml extensible variant type](https://caml.inria.fr/pub/docs/manual-ocaml/extn.html#sec252).
For example, see how [infer's frontend](https://github.com/facebook/infer/blob/8c6615963f79f03a644ae9087eb160da89a09a1a/infer/src/clang/clang_ast_extend.ml) uses this feature to extend `type_ptr`.
## Implementation details
High level:
- The plugin YojsonASTExporter defined in libtooling/ASTExporter.cpp outputs AST trees in an extended JSON format called "Yojson". Respectively, BiniouASTExporter outputs the AST in the "Biniou" format.
- Most of the ATD definitions are embedded in the C++ code of the ASTExporter. Refer to [ATD guidelines](../libtooling/ATD_GUIDELINES.md) for more information.
- We use scripts in libtooling/atdlib to extract and process the ATD definitions, then we use `atdgen` to generate the OCaml type definitions and json stub.
Utility functions in `Clang_ast_proj`:
- This module relies heavily on the C preprocessor - it uses information from clang headers to generate OCaml code.
- Clang provides `.inc` and `.def` files that provide information about available Node kinds. For example, [`TypeNode.def`](https://github.com/llvm-mirror/clang/blob/fe32c6a33461a8c60e18c0414d4844a47442328a/include/clang/AST/TypeNodes.def) contains information about all possible types that clang can produce. Internally clang uses the same headers.
- In order to add new function, one needs to identify clang header that contains relevant information. Sometimes it's useful to read clang codebase to see how certain enums are generated - usually clang includes same headers to generate them. For example decl kind enum is [defined](https://github.com/llvm-mirror/clang/blob/c5dd58546ce4d20cd71cc26cb790e7f91c8f908f/include/clang/AST/DeclBase.h#L84-L91) by including `clang/AST/DeclNodes.inc` file.
- Refer to existing code to see how to generate OCaml code with the C preprocessor.
- If something doesn't work, `build/Clang_ast_proj.ml` will contain generated code. This way, it's easier to see what happens during macro expansion.
Visitors:
- Implemented via [atdgen validation](https://mjambon.github.io/atdgen-doc/atdgen#field-validator)
- Adding support for a new visitor requires changing ATD annotations in ASTExporter and modifying `Clang_ast_visit.ml`
- Refer to existing visitors to see how it's done
- It is possible to modify the current node inside a visitor as long as its fields are mutable
Extensible variants:
- Implemented via [atdgen custom wrapper](https://mjambon.github.io/atdgen-doc/atdgen#field-t). It defines `type_ptr` to be extensible variant.
- When looking at Yojson/Biniou output, `type_ptr` will be of type int. It's up to atdgen serializer to call `wrap`/`unwrap`
Testing:
- The main program [`clang_ast_yojson_validator.ml`](clang_ast_yojson_validator.ml) is meant to parse, re-print, and compare yojson files emitted by ASTExporter. We use ydump (part of the yojson package) to normalize the original json and the re-emitted json before comparing them.
- `clang_ast_main_test.ml` runs custom validators to confirm that visitors work as expected. Its output is recorded and checked into repository.
## ATD docs
https://mjambon.github.io/atdgen-doc/atdgen
https://mjambon.github.io/atdgen-doc/atd-syntax

@ -0,0 +1,8 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
let () = Yojson_utils.run_converter_tool Clang_ast_j.read_decl Clang_ast_j.write_decl

@ -0,0 +1,116 @@
(*
* Copyright (c) 2015-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
module PointerOrd = struct
type t = int
let compare (i: int) (j: int) = i - j
end
module PointerMap = Map.Make (PointerOrd)
let declMap = ref PointerMap.empty
let stmtMap = ref PointerMap.empty
let typeMap = ref PointerMap.empty
let ivarToPropertyMap = ref PointerMap.empty
let empty_v = Clang_ast_visit.empty_visitor
(* This function is not thread-safe *)
let visit_ast ?(visit_decl= empty_v) ?(visit_stmt= empty_v) ?(visit_type= empty_v)
?(visit_src_loc= empty_v) top_decl =
Clang_ast_visit.decl_visitor := visit_decl ;
Clang_ast_visit.stmt_visitor := visit_stmt ;
Clang_ast_visit.type_visitor := visit_type ;
Clang_ast_visit.source_location_visitor := visit_src_loc ;
(* visit *)
ignore (Clang_ast_v.validate_decl [] top_decl)
let get_ptr_from_node node =
match node with
| `DeclNode decl ->
let decl_info = Clang_ast_proj.get_decl_tuple decl in
decl_info.Clang_ast_t.di_pointer
| `StmtNode stmt ->
let stmt_info, _ = Clang_ast_proj.get_stmt_tuple stmt in
stmt_info.Clang_ast_t.si_pointer
| `TypeNode c_type ->
let type_info = Clang_ast_proj.get_type_tuple c_type in
type_info.Clang_ast_t.ti_pointer
let get_val_from_node node =
match node with `DeclNode decl -> decl | `StmtNode stmt -> stmt | `TypeNode c_type -> c_type
let add_node_to_cache node cache =
let key = get_ptr_from_node node in
let value = get_val_from_node node in
cache := PointerMap.add key value !cache
let process_decl _path decl =
add_node_to_cache (`DeclNode decl) declMap ;
match decl with
| Clang_ast_t.ObjCPropertyDecl (_, _, obj_c_property_decl_info) -> (
match obj_c_property_decl_info.Clang_ast_t.opdi_ivar_decl with
| Some decl_ref ->
let ivar_pointer = decl_ref.Clang_ast_t.dr_decl_pointer in
ivarToPropertyMap := PointerMap.add ivar_pointer decl !ivarToPropertyMap
| None ->
() )
| _ ->
()
let add_stmt_to_cache _path stmt = add_node_to_cache (`StmtNode stmt) stmtMap
let add_type_to_cache _path c_type = add_node_to_cache (`TypeNode c_type) typeMap
let previous_sloc = {Clang_ast_t.sl_file= None; sl_line= None; sl_column= None}
let get_sloc current previous = match current with None -> previous | Some _ -> current
let mutate_sloc sloc file line column =
let open Clang_ast_t in
sloc.sl_file <- file ;
sloc.sl_line <- line ;
sloc.sl_column <- column
let reset_sloc sloc = mutate_sloc sloc None None None
let complete_source_location _path source_loc =
let open Clang_ast_t in
let file = get_sloc source_loc.sl_file previous_sloc.sl_file in
let line = get_sloc source_loc.sl_line previous_sloc.sl_line in
let column = get_sloc source_loc.sl_column previous_sloc.sl_column in
mutate_sloc source_loc file line column ;
mutate_sloc previous_sloc file line column
let reset_cache () =
declMap := PointerMap.empty ;
stmtMap := PointerMap.empty ;
typeMap := PointerMap.empty ;
ivarToPropertyMap := PointerMap.empty ;
reset_sloc previous_sloc
(* This function is not thread-safe *)
let index_node_pointers top_decl =
(* just in case *)
reset_cache () ;
(* populate cache *)
visit_ast ~visit_decl:process_decl ~visit_stmt:add_stmt_to_cache ~visit_type:add_type_to_cache
~visit_src_loc:complete_source_location top_decl ;
let result = (!declMap, !stmtMap, !typeMap, !ivarToPropertyMap) in
reset_cache () ; result

@ -0,0 +1,73 @@
(*
* Copyright (c) 2015-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
exception PointerMismatch
let validate_ptr key_ptr node =
let node_ptr = Clang_ast_main.get_ptr_from_node node in
if node_ptr != key_ptr then raise PointerMismatch
let validate_decl_ptr key_ptr decl = validate_ptr key_ptr (`DeclNode decl)
let validate_stmt_ptr key_ptr stmt = validate_ptr key_ptr (`StmtNode stmt)
let validate_type_ptr key_ptr c_type = validate_ptr key_ptr (`TypeNode c_type)
let print_node path kind_str =
let indent = String.make (List.length path) ' ' in
prerr_string indent ; prerr_string kind_str ; prerr_newline ()
let sloc_to_str sloc =
let opt_to_str to_str_f v = match v with Some x -> to_str_f x | None -> "None" in
let file_str = opt_to_str (fun f -> f) sloc.Clang_ast_t.sl_file in
let line_str = opt_to_str string_of_int sloc.Clang_ast_t.sl_line in
let column_str = opt_to_str string_of_int sloc.Clang_ast_t.sl_column in
file_str ^ ":" ^ line_str ^ ":" ^ column_str
let src_range_to_str range =
let first, last = range in
sloc_to_str first ^ " " ^ sloc_to_str last
let print_decl path decl =
let kind_str = Clang_ast_proj.get_decl_kind_string decl in
let decl_info = Clang_ast_proj.get_decl_tuple decl in
let src_str = src_range_to_str decl_info.Clang_ast_t.di_source_range in
print_node path (kind_str ^ " " ^ src_str)
let print_stmt path stmt = print_node path (Clang_ast_proj.get_stmt_kind_string stmt)
let print_map_size map =
let s = Clang_ast_main.PointerMap.cardinal map in
prerr_string (string_of_int s ^ " ")
let check_decl_cache_from_file fname =
let ast = Atdgen_runtime.Util.Json.from_file Clang_ast_j.read_decl fname in
let decl_cache, stmt_cache, type_cache, _ = Clang_ast_main.index_node_pointers ast in
print_map_size decl_cache ;
print_map_size stmt_cache ;
print_map_size type_cache ;
prerr_newline () ;
Clang_ast_main.PointerMap.iter validate_decl_ptr decl_cache ;
Clang_ast_main.PointerMap.iter validate_stmt_ptr stmt_cache ;
Clang_ast_main.PointerMap.iter validate_type_ptr type_cache ;
Clang_ast_main.visit_ast ~visit_decl:print_decl ~visit_stmt:print_stmt ast
let main =
let v = Sys.argv in
try for i = 1 to Array.length v - 1 do check_decl_cache_from_file v.(i) done with
| PointerMismatch ->
prerr_string "Pointer in cache doesn't match" ;
exit 1
| Yojson.Json_error s | Atdgen_runtime.Oj_run.Error s ->
prerr_string s ; prerr_newline () ; exit 1

@ -0,0 +1,34 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
module P = Printf
let rec visit_named_decls f decl =
let () =
match Clang_ast_proj.get_named_decl_tuple decl with Some (x, y) -> f x y | None -> ()
in
match Clang_ast_proj.get_decl_context_tuple decl with
| Some (l, _) ->
List.iter (visit_named_decls f) l
| None ->
()
let print_named_decl_from_file fname =
let ast = Atdgen_runtime.Util.Json.from_file Clang_ast_j.read_decl fname in
let getname name_info = name_info.Clang_ast_t.ni_name in
visit_named_decls
(fun _ info ->
print_string (getname info) ;
print_newline () )
ast
let main =
try Array.iteri (fun i arg -> if i <> 0 then print_named_decl_from_file arg) Sys.argv with
| Yojson.Json_error s | Atdgen_runtime.Oj_run.Error s ->
prerr_string s ; prerr_newline () ; exit 1

@ -0,0 +1,225 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open Clang_ast_t
#define s(x) #x
let get_decl_kind_string = function
#define DECL(DERIVED, BASE) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> s(DERIVED) ^ "Decl"
#define ABSTRACT_DECL(DECL)
#include <clang/AST/DeclNodes.inc>
let get_decl_tuple = function
#define DECL(DERIVED, BASE) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> (decl_tuple)
#define ABSTRACT_DECL(DECL)
#include <clang/AST/DeclNodes.inc>
let update_decl_tuple __f = function
#define DECL(DERIVED, BASE) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> \
let (decl_tuple) = __f (decl_tuple) in DERIVED@@Decl (@DERIVED@_decl_tuple)
#define ABSTRACT_DECL(DECL)
#include <clang/AST/DeclNodes.inc>
let get_decl_context_tuple = function
#define DECL(DERIVED, BASE)
#define ABSTRACT_DECL(DECL)
#define MY_DECL_CONTEXT(DERIVED) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> Some (decl_context_tuple)
(* skipping Function and ObjCMethod *)
#define TAG(DERIVED, BASE) MY_DECL_CONTEXT(DERIVED)
#define OBJCCONTAINER(DERIVED, BASE) MY_DECL_CONTEXT(DERIVED)
#define CAPTURED(DERIVED, BASE) MY_DECL_CONTEXT(DERIVED)
#define LINKAGESPEC(DERIVED, BASE) MY_DECL_CONTEXT(DERIVED)
#define NAMESPACE(DERIVED, BASE) MY_DECL_CONTEXT(DERIVED)
#define TRANSLATIONUNIT(DERIVED, BASE) MY_DECL_CONTEXT(DERIVED)
#include <clang/AST/DeclNodes.inc>
#undef MY_DECL_CONTEXT
| _ -> None
let update_decl_context_tuple __f = function
#define DECL(DERIVED, BASE)
#define ABSTRACT_DECL(DECL)
#define MY_DECL_CONTEXT(DERIVED) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> \
let (decl_context_tuple) = __f (decl_context_tuple) in DERIVED@@Decl (@DERIVED@_decl_tuple)
(* skipping Function and ObjCMethod *)
#define TAG(DERIVED, BASE) MY_DECL_CONTEXT(DERIVED)
#define OBJCCONTAINER(DERIVED, BASE) MY_DECL_CONTEXT(DERIVED)
#define CAPTURED(DERIVED, BASE) MY_DECL_CONTEXT(DERIVED)
#define LINKAGESPEC(DERIVED, BASE) MY_DECL_CONTEXT(DERIVED)
#define NAMESPACE(DERIVED, BASE) MY_DECL_CONTEXT(DERIVED)
#define TRANSLATIONUNIT(DERIVED, BASE) MY_DECL_CONTEXT(DERIVED)
#include <clang/AST/DeclNodes.inc>
#undef MY_DECL_CONTEXT
| x -> x
let get_function_decl_tuple = function
#define DECL(DERIVED, BASE)
#define ABSTRACT_DECL(DECL)
#define FUNCTION(DERIVED, BASE) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> Some (function_decl_tuple)
#include <clang/AST/DeclNodes.inc>
| _ -> None
let get_named_decl_tuple = function
#define DECL(DERIVED, BASE)
#define ABSTRACT_DECL(DECL)
#define NAMED(DERIVED, BASE) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> Some (named_decl_tuple)
#include <clang/AST/DeclNodes.inc>
| _ -> None
let update_named_decl_tuple __f = function
#define DECL(DERIVED, BASE)
#define ABSTRACT_DECL(DECL)
#define NAMED(DERIVED, BASE) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> \
let (named_decl_tuple) = __f (named_decl_tuple) in DERIVED@@Decl (@DERIVED@_decl_tuple)
#include <clang/AST/DeclNodes.inc>
| x -> x
let get_type_decl_tuple = function
#define DECL(DERIVED, BASE)
#define ABSTRACT_DECL(DECL)
#define TYPE(DERIVED, BASE) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> Some (type_decl_tuple)
#include <clang/AST/DeclNodes.inc>
| _ -> None
let update_type_decl_tuple __f = function
#define DECL(DERIVED, BASE)
#define ABSTRACT_DECL(DECL)
#define TYPE(DERIVED, BASE) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> \
let (type_decl_tuple) = __f (type_decl_tuple) in DERIVED@@Decl (@DERIVED@_decl_tuple)
#include <clang/AST/DeclNodes.inc>
| x -> x
let get_tag_decl_tuple = function
#define DECL(DERIVED, BASE)
#define ABSTRACT_DECL(DECL)
#define TAG(DERIVED, BASE) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> Some (tag_decl_tuple)
#include <clang/AST/DeclNodes.inc>
| _ -> None
let update_tag_decl_tuple __f = function
#define DECL(DERIVED, BASE)
#define ABSTRACT_DECL(DECL)
#define TAG(DERIVED, BASE) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> \
let (tag_decl_tuple) = __f (tag_decl_tuple) in DERIVED@@Decl (@DERIVED@_decl_tuple)
#include <clang/AST/DeclNodes.inc>
| x -> x
let get_var_decl_tuple = function
#define DECL(DERIVED, BASE)
#define ABSTRACT_DECL(DECL)
#define VAR(DERIVED, BASE) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> Some (var_decl_tuple)
#include <clang/AST/DeclNodes.inc>
| _ -> None
let update_var_decl_tuple __f = function
#define DECL(DERIVED, BASE)
#define ABSTRACT_DECL(DECL)
#define VAR(DERIVED, BASE) | DERIVED@@Decl (@DERIVED@_decl_tuple) -> \
let (var_decl_tuple) = __f (var_decl_tuple) in DERIVED@@Decl (@DERIVED@_decl_tuple)
#include <clang/AST/DeclNodes.inc>
| x -> x
let get_stmt_kind_string = function
#define STMT(CLASS, PARENT) | CLASS (@CLASS@_tuple) -> s(CLASS)
#define ABSTRACT_STMT(STMT)
#include <clang/AST/StmtNodes.inc>
let get_stmt_tuple = function
#define STMT(CLASS, PARENT) | CLASS (@CLASS@_tuple) -> (stmt_tuple)
#define ABSTRACT_STMT(STMT)
#include <clang/AST/StmtNodes.inc>
let update_stmt_tuple __f = function
#define STMT(CLASS, PARENT) | CLASS (@CLASS@_tuple) -> \
let (stmt_tuple) = __f (stmt_tuple) in CLASS (@CLASS@_tuple)
#define ABSTRACT_STMT(STMT)
#include <clang/AST/StmtNodes.inc>
let get_expr_tuple = function
#define STMT(CLASS, PARENT)
#define EXPR(CLASS, PARENT) | CLASS (@CLASS@_tuple) -> Some (expr_tuple)
#define ABSTRACT_STMT(STMT)
#include <clang/AST/StmtNodes.inc>
| _ -> None
let update_expr_tuple __f = function
#define STMT(CLASS, PARENT)
#define EXPR(CLASS, PARENT) | CLASS (@CLASS@_tuple) -> \
let (expr_tuple) = __f (expr_tuple) in CLASS (@CLASS@_tuple)
#define ABSTRACT_STMT(STMT)
#include <clang/AST/StmtNodes.inc>
| x -> x
let get_cxx_construct_expr_tuple = function
#define STMT(CLASS, PARENT)
#define CXXCONSTRUCTEXPR(CLASS, PARENT) | CLASS (@CLASS@_tuple) -> Some (cxx_construct_expr_tuple)
#define ABSTRACT_STMT(STMT)
#include <clang/AST/StmtNodes.inc>
| _ -> None
let update_cxx_construct_expr_tuple __f = function
#define STMT(CLASS, PARENT)
#define CXXCONSTRUCTEXPR(CLASS, PARENT) | CLASS (@CLASS@_tuple) -> \
let (cxx_construct_expr_tuple) = __f (cxx_construct_expr_tuple) in CLASS (@CLASS@_tuple)
#define ABSTRACT_STMT(STMT)
#include <clang/AST/StmtNodes.inc>
| x -> x
let get_type_tuple = function
#define TYPE(DERIVED, BASE) | DERIVED@@Type (@DERIVED@_type_tuple) -> (type_tuple)
#define ABSTRACT_TYPE(DERIVED, BASE)
TYPE(None, Type) (* special case for nullptr type *)
#include <clang/AST/TypeNodes.def>
let is_valid_binop_kind_name = function
#define BINARY_OPERATION(Name, Spelling) | s(Name) -> true
#include <clang/AST/OperationKinds.def>
| _ -> false
let is_valid_unop_kind_name = function
#define UNARY_OPERATION(Name, Spelling) | s(Name) -> true
#include <clang/AST/OperationKinds.def>
| _ -> false
let string_of_binop_kind = function
#define BINARY_OPERATION(Name, Spelling) | `Name -> s(Name)
#include <clang/AST/OperationKinds.def>
let string_of_unop_kind = function
#define UNARY_OPERATION(Name, Spelling) | `Name -> s(Name)
#include <clang/AST/OperationKinds.def>
let is_valid_astnode_kind = function
#define DECL(DERIVED, BASE) | s(DERIVED@@Decl) -> true
#define ABSTRACT_DECL(DECL)
#include <clang/AST/DeclNodes.inc>
#define STMT(CLASS, PARENT) | s(CLASS) -> true
#define ABSTRACT_STMT(STMT)
#include <clang/AST/StmtNodes.inc>
| _ -> false
let string_of_cast_kind = function
#define CAST_OPERATION(Name) | `Name -> s(Name)
#include <clang/AST/OperationKinds.def>
let get_cast_kind = function
#define STMT(CLASS, PARENT)
#define ABSTRACT_STMT(TYPE)
#define CASTEXPR(Type, Base) | Type (_, _, _, cast_expr_info)
#define EXPLICITCASTEXPR(Type, Base) | Type (_, _, _, cast_expr_info, _)
#define CXXNAMEDCASTEXPR(Type, Base) | Type (_, _, _, cast_expr_info, _, _)
#define OBJCBRIDGEDCASTEXPR(Type, Base) | Type (_, _, _, cast_expr_info, _, _)
#include<clang/AST/StmtNodes.inc>
-> Some cast_expr_info.cei_cast_kind
| _ -> None

@ -0,0 +1,41 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open Clang_ast_t
val get_cast_kind : stmt -> cast_kind option
val get_decl_context_tuple : decl -> (decl_context_tuple) option
val get_decl_kind_string : decl -> string
val get_decl_tuple : decl -> (decl_tuple)
val get_expr_tuple : stmt -> (expr_tuple) option
val get_cxx_construct_expr_tuple : stmt -> (cxx_construct_expr_tuple) option
val get_function_decl_tuple : decl -> (function_decl_tuple) option
val get_named_decl_tuple : decl -> (named_decl_tuple) option
val get_stmt_kind_string : stmt -> string
val get_stmt_tuple : stmt -> (stmt_tuple)
val get_tag_decl_tuple : decl -> (tag_decl_tuple) option
val get_type_decl_tuple : decl -> (type_decl_tuple) option
val get_type_tuple : c_type -> (type_tuple)
val get_var_decl_tuple : decl -> (var_decl_tuple) option
val is_valid_astnode_kind : string -> bool
val is_valid_binop_kind_name : string -> bool
val is_valid_unop_kind_name : string -> bool
val string_of_binop_kind : binary_operator_kind -> string
val string_of_cast_kind : cast_kind -> string
val string_of_unop_kind : unary_operator_kind -> string
val update_cxx_construct_expr_tuple : ((cxx_construct_expr_tuple) -> (cxx_construct_expr_tuple)) -> stmt -> stmt
val update_decl_context_tuple : ((decl_context_tuple) -> (decl_context_tuple)) -> decl -> decl
val update_decl_tuple : ((decl_tuple) -> (decl_tuple)) -> decl -> decl
val update_expr_tuple : ((expr_tuple) -> (expr_tuple)) -> stmt -> stmt
val update_named_decl_tuple : ((named_decl_tuple) -> (named_decl_tuple)) -> decl -> decl
val update_stmt_tuple : ((stmt_tuple) -> (stmt_tuple)) -> stmt -> stmt
val update_tag_decl_tuple : ((tag_decl_tuple) -> (tag_decl_tuple)) -> decl -> decl
val update_type_decl_tuple : ((type_decl_tuple) -> (type_decl_tuple)) -> decl -> decl
val update_var_decl_tuple : ((var_decl_tuple) -> (var_decl_tuple)) -> decl -> decl

@ -0,0 +1,122 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open Utils
open Clang_ast_t
open Clang_ast_proj
let source_location ?file ?line ?column () = {sl_file= file; sl_line= line; sl_column= column}
let empty_source_location = source_location ()
let decl_info start stop =
{ di_pointer= 0
; di_parent_pointer= None
; di_source_range= (start, stop)
; di_owning_module= None
; di_is_hidden= false
; di_is_implicit= false
; di_is_used= false
; di_is_this_declaration_referenced= false
; di_is_invalid_decl= false
; di_attributes= []
; di_full_comment= None
; di_access= `None }
let name_info name = {ni_name= name; ni_qual_name= [name]}
let append_name_info info suffix =
{ni_name= info.ni_name ^ suffix; ni_qual_name= List.map (fun x -> x ^ suffix) info.ni_qual_name}
let qual_type ptr =
{ qt_type_ptr= ptr
; qt_is_const= false
; qt_is_restrict= false
; qt_is_volatile= false }
let var_decl_info ~is_global =
{ vdi_is_global= is_global
; vdi_is_extern= false
; vdi_is_static_local= false
; vdi_is_static_data_member= false
; vdi_is_const_expr= false
; vdi_is_init_ice= false
; vdi_is_init_expr_cxx11_constant= false
; vdi_init_expr= None
; vdi_parm_index_in_function= None
; vdi_is_static = false}
let stmt_info pointer =
{ si_pointer= pointer
; si_source_range= (empty_source_location, empty_source_location) }
let expr_info qual_type =
{ ei_qual_type= qual_type
; ei_value_kind= `RValue
; ei_object_kind= `Ordinary }
let cxx_construct_expr_info decl_ref is_copy_constructor =
{ xcei_decl_ref= decl_ref
; xcei_is_elidable= false
; xcei_requires_zero_initialization= false
; xcei_is_copy_constructor= is_copy_constructor }
let () =
let di = decl_info empty_source_location empty_source_location in
let decl = LabelDecl (di, name_info "foo") in
assert_equal "get_decl_kind_string" (get_decl_kind_string decl) "LabelDecl" ;
assert_equal "get_decl_tuple" (get_decl_tuple decl) di ;
assert_equal "get_decl_context_tuple" (get_decl_context_tuple decl) None ;
assert_equal "get_named_decl_tuple" (get_named_decl_tuple decl) (Some (di, name_info "foo")) ;
assert_equal "get_type_decl_tuple" (get_type_decl_tuple decl) None ;
assert_equal "get_tag_decl_tuple" (get_tag_decl_tuple decl) None ;
assert_equal "is_valid_astnode_kind" (is_valid_astnode_kind (get_decl_kind_string decl)) true ;
assert_equal "is_valid_astnode_kind" (is_valid_astnode_kind "AFakeNodeThatDoesNotExist") false ;
let decl2 = update_named_decl_tuple (fun (di, info) -> (di, append_name_info info "bar")) decl in
assert_equal "update_named_decl_tuple" (get_named_decl_tuple decl2)
(Some (di, name_info "foobar")) ;
let di2 = decl_info (source_location ~file:"bla" ()) (source_location ~file:"bleh" ()) in
let decl3 = update_decl_tuple (fun _ -> di2) decl in
assert_equal "update_decl_tuple" (get_decl_tuple decl3) di2 ;
assert_equal "get_var_decl_tuple_none" (get_var_decl_tuple decl) None ;
let vdi = var_decl_info ~is_global:true in
let qt = qual_type (Clang_ast_types.TypePtr.wrap 0) in
let var_decl = ParmVarDecl(di, name_info "fooey", qt, vdi) in
assert_equal "get_var_decl_tuple" (get_var_decl_tuple var_decl)
(Some (di, name_info "fooey", qt, vdi)) ;
let updated_var_decl = update_var_decl_tuple
(fun (di, ni, qt, vdi) ->
(di, append_name_info ni "-mod", qt, var_decl_info ~is_global:false))
var_decl in
assert_equal "update_var_decl_tuple" (get_var_decl_tuple updated_var_decl)
(Some (di, name_info "fooey-mod", qt, var_decl_info ~is_global:false)) ;
let stmt = DoStmt(stmt_info 0, []) in
assert_equal "get_cxx_construct_expr_tuple_from_stmt"
(get_cxx_construct_expr_tuple stmt) None ;
let ei = expr_info qt in
let dr = { dr_kind= `CXXConstructor
; dr_decl_pointer= 0
; dr_name= None
; dr_is_hidden= false
; dr_qual_type= None } in
let xcei = cxx_construct_expr_info dr true in
let xcei2 = cxx_construct_expr_info dr false in
let cxx_ctor_expr = CXXConstructExpr(stmt_info 1, [], ei, xcei) in
assert_equal "get_cxx_construct_expr_tuple"
(get_cxx_construct_expr_tuple cxx_ctor_expr)
(Some (stmt_info 1, [], ei, xcei)) ;
let updated_cxx_ctor_expr = update_cxx_construct_expr_tuple
(fun (si, sl, ei, xcei) ->
(stmt_info (si.si_pointer + 1)), sl, ei, xcei2)
cxx_ctor_expr in
assert_equal "update_cxx_construct_expr_tuple"
(get_cxx_construct_expr_tuple updated_cxx_ctor_expr)
(Some (stmt_info 2, [], ei, xcei2)) ;

@ -0,0 +1,17 @@
(*
* Copyright (c) 2015-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
(* Type pointers *)
module TypePtr = struct
(* extensible type to allow users to specify more variants *)
type t = ..
type t += Ptr of int
let wrap x = Ptr x
let unwrap = function Ptr x -> x | _ -> raise (invalid_arg "Unknown variant type")
end

@ -0,0 +1,47 @@
(*
* Copyright (c) 2015-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
type visit_decl_t = Atdgen_runtime.Util.Validation.path -> Clang_ast_t.decl -> unit
type visit_stmt_t = Atdgen_runtime.Util.Validation.path -> Clang_ast_t.stmt -> unit
type visit_type_t = Atdgen_runtime.Util.Validation.path -> Clang_ast_t.c_type -> unit
type visit_src_loc_t = Atdgen_runtime.Util.Validation.path -> Clang_ast_t.source_location -> unit
let empty_visitor _path _decl = ()
let decl_visitor = ref (empty_visitor : visit_decl_t)
let stmt_visitor = ref (empty_visitor : visit_stmt_t)
let type_visitor = ref (empty_visitor : visit_type_t)
let source_location_visitor = ref (empty_visitor : visit_src_loc_t)
let visit_decl path decl =
!decl_visitor path decl ;
(* return None to pass atd validation *)
None
let visit_stmt path stmt =
!stmt_visitor path stmt ;
(* return None to pass atd validation *)
None
let visit_type path c_type =
!type_visitor path c_type ;
(* return None to pass atd validation *)
None
let visit_source_loc path src_loc =
!source_location_visitor path src_loc ;
(* return None to pass atd validation *)
None

@ -0,0 +1,8 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
let main = Yojson_utils.make_yojson_validator Clang_ast_j.read_decl Clang_ast_j.write_decl Sys.argv

@ -0,0 +1,125 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
module U = Unix
let file_exists name =
try
U.access name [U.F_OK] ;
true
with U.Unix_error _ -> false
(* Forked processes will not start from 0 but this is inessential. *)
let tmp_counter = ref 0
let mktemp base =
let pid = U.getpid () in
let rec aux () =
let name = Printf.sprintf "%s.%d.%08d.tmp" base pid !tmp_counter in
incr tmp_counter ;
if
file_exists name
(* This should not happen unless the file is very old and the pid is reused. *)
then aux ()
else name
in
aux ()
let buffer_size = 8192
let tee ic ocs =
let buffer = Bytes.create buffer_size in
let rec loop () =
match input ic buffer 0 buffer_size with
| 0 ->
()
| r ->
List.iter (fun oc -> output oc buffer 0 r) ocs ;
loop ()
in
loop ()
let gzip ic oc =
let ocz = Gzip.open_out_chan oc in
let buffer = Bytes.create buffer_size in
let rec loop () =
match input ic buffer 0 buffer_size with 0 -> () | r -> Gzip.output ocz buffer 0 r ; loop ()
in
let success = try loop () ; true with Gzip.Error _ -> false in
Gzip.close_out ocz ; success
let gunzip ic oc =
let icz = Gzip.open_in_chan ic in
let buffer = Bytes.create buffer_size in
let rec loop () =
match Gzip.input icz buffer 0 buffer_size with 0 -> () | r -> output oc buffer 0 r ; loop ()
in
let success = try loop () ; true with Gzip.Error _ -> false in
Gzip.close_in icz ; success
let copy ic oc = tee ic [oc]
let rec restart_on_EINTR f x = try f x with U.Unix_error (U.EINTR, _, _) -> restart_on_EINTR f x
let close fd = try U.close fd with U.Unix_error _ -> ()
let close_in = close_in_noerr
let close_out = close_out_noerr
let wait pid =
match snd (restart_on_EINTR (U.waitpid []) pid) with U.WEXITED 0 -> true | _ -> false
let exec args stdin stdout stderr =
wait
(U.create_process args.(0) args (U.descr_of_in_channel stdin) (U.descr_of_out_channel stdout)
(U.descr_of_out_channel stderr))
let diff file1 file2 oc = exec [|"diff"; file1; file2|] stdin oc stderr
let fork f =
let fd_in, fd_out = U.pipe () in
match U.fork () with
| 0
-> (
U.close fd_in ;
try if f (U.out_channel_of_descr fd_out) then exit 0 else ( close fd_out ; exit 1 )
with _ -> close fd_out ; exit 2 )
| pid ->
if pid < 0 then failwith "fork error"
else ( U.close fd_out ; (pid, U.in_channel_of_descr fd_in) )
let compose f g ic oc =
let pid, ic1 = fork (f ic) in
let r1 = g ic1 oc in
let r2 = wait pid in
close_in ic1 ; r1 && r2
let diff_on_same_input f1 f2 ic oc =
let file = mktemp "input" in
let ofile = open_out file in
copy ic ofile ;
close_out ofile ;
let ifile1 = open_in file and ifile2 = open_in file in
let file1 = mktemp "output1" and file2 = mktemp "output2" in
let ofile1 = open_out file1 and ofile2 = open_out file2 in
let r1 = f1 ifile1 ofile1 and r2 = f2 ifile2 ofile2 in
close_in ifile1 ;
close_in ifile2 ;
close_out ofile1 ;
close_out ofile2 ;
let success = if r1 && r2 then diff file1 file2 oc else false in
U.unlink file ; U.unlink file1 ; U.unlink file2 ; success

@ -0,0 +1,38 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
val file_exists : string -> bool
val mktemp : string -> string
val wait : int -> bool
val exec : string array -> in_channel -> out_channel -> out_channel -> bool
val close_in : in_channel -> unit
val close_out : out_channel -> unit
val tee : in_channel -> out_channel list -> unit
val copy : in_channel -> out_channel -> unit
val diff : string -> string -> out_channel -> bool
val gzip : in_channel -> out_channel -> bool
val gunzip : in_channel -> out_channel -> bool
val fork : (out_channel -> bool) -> int * in_channel
val compose :
(in_channel -> out_channel -> bool) -> (in_channel -> out_channel -> bool) -> in_channel
-> out_channel -> bool
val diff_on_same_input :
(in_channel -> out_channel -> bool) -> (in_channel -> out_channel -> bool) -> in_channel
-> out_channel -> bool

@ -0,0 +1,19 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open Process
let main =
let pid, ic =
fork (fun oc ->
output_string oc "This is a test\n" ;
true )
in
let zipunzip = compose gzip gunzip in
ignore (diff_on_same_input (fun ic oc -> copy ic oc ; flush_all () ; true) zipunzip ic stderr) ;
close_in ic ;
ignore (wait pid)

@ -0,0 +1,440 @@
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
add_all_ints
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
S
S
S
~S
S
test
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
i
l
m
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
Foo
Foo
func
someFunction
i
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
A
A
f
operator=
operator=
~A
A
A
A
B
B
operator=
operator=
~B
B
B
B
C
C
f
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
X
X
X
X
operator=
~X
Y
Y
Y
~Y
Y
f
g
h
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
sqrt
pow
Form
Form
area
color
vmethod
getArea
setArea
operator=
operator=
~Form
Circle
Circle
vmethod
getRatio
setRatio
isDark
operator=
operator=
~Circle
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
main
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
r
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
Q
V
V
I
i
<using-directive>
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
pod
pod
a
pod
pod
pod
~pod
cpplike
cpplike
a
b
c
cpplike
cpplike
cpplike
cpplike
~cpplike
test
operator new
operator new[]
operator delete
operator delete[]
test_c11
operator new
test_placement
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
Point
Point
x
y
fun
blank
A
A
a
a
B
B
b
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
T
T
age
foo
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
S
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
nsa
nsb
a
<using-directive>
B
b
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
N
S
S
S
field
S
S
field
S
~S
S
S
operator=
operator=
test
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
get
get
test
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
X
X
f
operator=
operator=
~X
is_pod
a
b
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
no_throw
main
instancetype
__int128_t
__uint128_t
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
AnotherClass
Y
y1
instancetype
__int128_t
__uint128_t
SEL
id
Class
Protocol
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
BOOL
NSUInteger
NSObject
alloc
new
autorelease
init
class
respondsToSelector:
conformsToProtocol:
NSNumber
numberWithInt:
NSString
length
NSDictionary
dictionaryWithObjects:forKeys:count:
objectForKeyedSubscript:
NSArray
arrayWithObjects:count:
objectAtIndexedSubscript:
NSException
NSLog
NSLog
Hello
say:
Hello
say:
main
instancetype
__int128_t
__uint128_t
SEL
id
Class
Protocol
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
BOOL
NSUInteger
NSObject
alloc
new
autorelease
init
class
respondsToSelector:
conformsToProtocol:
NSNumber
numberWithInt:
NSString
length
NSDictionary
dictionaryWithObjects:forKeys:count:
objectForKeyedSubscript:
NSArray
arrayWithObjects:count:
objectAtIndexedSubscript:
NSException
NSLog
NSLog
MyProtocol
str
str
setStr:
SomeProtocol
MyClass
str
x
y
delegate
str
setStr:
x
setX:
y
setY:
delegate
setDelegate:
foo:
MyClass
foo:
_str
_x
_y
_delegate
MyCategory
bar:
MyCategory
bar:
MyClassGenerics
BarGenerics
newWithCs:
MySubclass
MySubclass
bar:
foo:
main
instancetype
__int128_t
__uint128_t
SEL
id
Class
Protocol
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
BOOL
NSUInteger
NSObject
alloc
new
autorelease
init
class
respondsToSelector:
conformsToProtocol:
NSNumber
numberWithInt:
NSString
length
NSDictionary
dictionaryWithObjects:forKeys:count:
objectForKeyedSubscript:
NSArray
arrayWithObjects:count:
objectAtIndexedSubscript:
NSException
NSLog
NSLog
ABFDataRef
ABFDataRef
ABFData
ABFDataCreate
A
A
bridge_transfer_example
instancetype
__int128_t
__uint128_t
SEL
id
Class
Protocol
__NSConstantString
__builtin_ms_va_list
__builtin_va_list
box
instancetype

@ -0,0 +1,21 @@
length of raw value: 135
pretty-printed value (without dictionary):
<#33e33622:
(<#33e33622: (<#0307aa6d>, { #00000078: 1, #00000079: 2 }, <#0307aa6d>)>,
{ #00000078: 2, #00000079: 2 },
<#33e33622:
(<#33e33622:
(<#0307aa6d>, { #00000078: 3, #00000079: 2 }, <#0307aa6d>)>,
{ #00000078: 4, #00000079: 2 },
<#33e33622:
(<#0307aa6d>, { #00000078: 5, #00000079: 2 }, <#0307aa6d>)>)>)>
pretty-printed value (with dictionary):
<"Node":
(<"Node": (<"Empty">, { #00000078: 1, #00000079: 2 }, <"Empty">)>,
{ #00000078: 2, #00000079: 2 },
<"Node":
(<"Node": (<"Empty">, { #00000078: 3, #00000079: 2 }, <"Empty">)>,
{ #00000078: 4, #00000079: 2 },
<"Node": (<"Empty">, { #00000078: 5, #00000079: 2 }, <"Empty">)>)>)>
value:<"Node":(<"Node":(<"Empty">,{"x":1,"y":2},<"Empty">)>,{"x":2,"y":2},<"Node":(<"Node":(<"Empty">,{"x":3,"y":2},<"Empty">)>,{"x":4,"y":2},<"Node":(<"Empty">,{"x":5,"y":2},<"Empty">)>)>)>
length: 184

@ -0,0 +1,194 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
module H = Hashtbl
(* misc *)
(* maps '-' to the standard input *)
let open_in name = if name = "-" then stdin else Pervasives.open_in name
(* maps '-' to the standard output *)
let open_out name = if name = "-" then stdout else Pervasives.open_out name
let make_cached f =
let h = H.create 10 in
function
| x ->
try H.find h x with Not_found ->
let y = f x in
H.add h x y ; y
(* missing string API *)
let string_starts_with s1 s2 =
try
let n = String.length s2 in
String.sub s1 0 n = s2
with Invalid_argument _ -> false
let string_ends_with s1 s2 =
try
let n = String.length s2 in
String.sub s1 (String.length s1 - n) n = s2
with Invalid_argument _ -> false
let string_split c s =
let len = String.length s in
let rec aux acc pos =
if pos >= len then "" :: acc
else
try
let next = String.index_from s pos c in
aux (String.sub s pos (next - pos) :: acc) (next + 1)
with Not_found -> String.sub s pos (String.length s - pos) :: acc
in
List.rev (aux [] 0)
let string_join c l = String.concat (String.make 1 c) l
(* lists *)
let rec list_starts_with l1 l2 =
match (l1, l2) with
| _, [] ->
true
| x1 :: q1, x2 :: q2 when x1 = x2 ->
list_starts_with q1 q2
| _ ->
false
let list_ends_with l1 l2 = list_starts_with (List.rev l1) (List.rev l2)
(* missing stream API *)
let line_stream_of_channel channel =
Stream.from (fun _ -> try Some (input_line channel) with End_of_file -> None)
let stream_concat streams =
let current_stream = ref None in
let rec next i =
try
let stream =
match !current_stream with
| Some stream ->
stream
| None ->
let stream = Stream.next streams in
current_stream := Some stream ;
stream
in
try Some (Stream.next stream) with Stream.Failure ->
current_stream := None ;
next i
with Stream.Failure -> None
in
Stream.from next
let stream_append s1 s2 = stream_concat (Stream.of_list [s1; s2])
let stream_map f stream =
let rec next _ = try Some (f (Stream.next stream)) with Stream.Failure -> None in
Stream.from next
let stream_filter p stream =
let rec next i =
try
let value = Stream.next stream in
if p value then Some value else next i
with Stream.Failure -> None
in
Stream.from next
let stream_fold f init stream =
let result = ref init in
Stream.iter (fun x -> result := f x !result) stream ;
!result
let stream_to_list s = List.rev (stream_fold (fun x l -> x :: l) [] s)
(* simplistic unit testing *)
let string_counters = Hashtbl.create 10
let assert_true s b =
( try
let i = Hashtbl.find string_counters s in
Hashtbl.replace string_counters s (i + 1)
with Not_found -> Hashtbl.add string_counters s 1 ) ;
if not b then (
Printf.fprintf stderr "%s (%d)\n" s (Hashtbl.find string_counters s) ;
exit 1 )
else ()
let assert_false s b = assert_true s (not b)
let assert_equal s x y = assert_true s (x = y)
(* union-find data structure *)
module DisjointSet = struct
type 'a bucket = {mutable parent: 'a; mutable rank: int}
type 'a t = ('a, 'a bucket) Hashtbl.t
let create () = Hashtbl.create 10
let bucket t x =
try Hashtbl.find t x with Not_found ->
let b = {parent= x; rank= 0} in
Hashtbl.add t x b ; b
let rec find_bucket t x =
let b = bucket t x in
if b.parent = x then b
else
let b0 = find_bucket t b.parent in
b.parent <- b0.parent ;
b0
let find t x = (find_bucket t x).parent
let union t x y =
let bx = find_bucket t x and by = find_bucket t y in
if bx.parent <> by.parent then
if bx.rank < by.rank then bx.parent <- by.parent
else (
by.parent <- bx.parent ;
if bx.rank = by.rank then bx.rank <- bx.rank + 1 )
let iter t f = Hashtbl.iter (fun x b -> f x (if x = b.parent then x else find t b.parent)) t
end
(* Helper for command line parsing with Arg *)
let fix_arg_spec l usage_msg =
let result = ref [] in
let usage () =
Arg.usage !result usage_msg ;
exit 0
in
let extra =
[ ("-h", Arg.Unit usage, " Display this list of options.")
; ("-help", Arg.Unit usage, " ")
; ("--help", Arg.Unit usage, " ") ]
in
result := Arg.align (l @ extra) ;
!result

@ -0,0 +1,59 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
val open_in : string -> in_channel
val open_out : string -> out_channel
val string_starts_with : string -> string -> bool
val string_ends_with : string -> string -> bool
val string_split : char -> string -> string list
val string_join : char -> string list -> string
val list_starts_with : 'a list -> 'a list -> bool
val list_ends_with : 'a list -> 'a list -> bool
val make_cached : ('a -> 'b) -> 'a -> 'b
val line_stream_of_channel : in_channel -> string Stream.t
val stream_concat : 'a Stream.t Stream.t -> 'a Stream.t
val stream_append : 'a Stream.t -> 'a Stream.t -> 'a Stream.t
val stream_map : ('a -> 'b) -> 'a Stream.t -> 'b Stream.t
val stream_filter : ('a -> bool) -> 'a Stream.t -> 'a Stream.t
val stream_fold : ('a -> 'b -> 'b) -> 'b -> 'a Stream.t -> 'b
val stream_to_list : 'a Stream.t -> 'a list
val assert_true : string -> bool -> unit
val assert_false : string -> bool -> unit
val assert_equal : string -> 'a -> 'a -> unit
module DisjointSet : sig
type 'a t
val create : unit -> 'a t
val find : 'a t -> 'a -> 'a
val union : 'a t -> 'a -> 'a -> unit
val iter : 'a t -> ('a -> 'a -> unit) -> unit
end
val fix_arg_spec :
(Arg.key * Arg.spec * Arg.doc) list -> Arg.usage_msg -> (Arg.key * Arg.spec * Arg.doc) list

@ -0,0 +1,93 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open Utils
open Process
let () =
assert_true "string_ends_with" (string_ends_with "foo" "o") ;
assert_true "string_ends_with" (string_ends_with "foo" "") ;
assert_false "string_ends_with" (string_ends_with "foo" "f")
let () =
assert_true "string_starts_with" (string_starts_with "foo" "f") ;
assert_true "string_starts_with" (string_starts_with "foo" "") ;
assert_false "string_starts_with" (string_starts_with "foo" "o")
let () =
assert_equal "string_split" (string_split ' ' "foo bla") ["foo"; "bla"] ;
assert_equal "string_split" (string_split ' ' "foo") ["foo"] ;
assert_equal "string_split" (string_split ' ' "") [""] ;
assert_equal "string_split" (string_split ' ' " ") [""; ""] ;
assert_equal "string_split" (string_split ' ' " foo bla ") [""; "foo"; "bla"; ""]
let () =
assert_true "list_ends_with" (list_ends_with [1; 2; 3] [3]) ;
assert_false "list_ends_with" (list_ends_with [1; 2; 3] [2])
let () =
assert_true "list_starts_with" (list_starts_with [1; 2; 3] [1]) ;
assert_false "list_starts_with" (list_starts_with [1; 2; 3] [2])
let () =
let pid, ic = Process.fork (fun oc -> output_string oc "foo\nbar\n" ; true) in
let lines = stream_to_list (line_stream_of_channel ic) in
assert_true "line_stream_of_channel::wait" (Process.wait pid) ;
assert_equal "line_stream_of_channel::result" lines ["foo"; "bar"]
let () =
let lines = stream_to_list (stream_append (Stream.of_list ["foo"]) (Stream.of_list ["bar"])) in
assert_equal "line_stream_of_channel::result" lines ["foo"; "bar"]
let () =
let count = ref 0 in
let f _ = incr count in
let g = make_cached f in
List.iter g [1; 2; 1; 3; 1] ;
assert_equal "make_cached" !count 3
let () =
let s = DisjointSet.create () in
assert_equal "DisjointSet" (DisjointSet.find s 1) 1 ;
assert_equal "DisjointSet" (DisjointSet.find s 2) 2 ;
DisjointSet.union s 1 2 ;
DisjointSet.union s 1 3 ;
DisjointSet.union s 2 4 ;
DisjointSet.union s 5 6 ;
assert_equal "DisjointSet" (DisjointSet.find s 1) (DisjointSet.find s 2) ;
assert_equal "DisjointSet" (DisjointSet.find s 1) (DisjointSet.find s 3) ;
assert_equal "DisjointSet" (DisjointSet.find s 1) (DisjointSet.find s 4) ;
assert_equal "DisjointSet" (DisjointSet.find s 1) (DisjointSet.find s 4) ;
assert_equal "DisjointSet" (DisjointSet.find s 5) (DisjointSet.find s 6) ;
assert_true "DisjointSet" (DisjointSet.find s 1 <> DisjointSet.find s 6) ;
DisjointSet.union s 3 6 ;
assert_true "DisjointSet" (DisjointSet.find s 1 = DisjointSet.find s 6) ;
assert_equal "DisjointSet" (DisjointSet.find s 5) (DisjointSet.find s 6) ;
let l = ref [] in
DisjointSet.iter s (fun x y -> l := (y, x) :: !l) ;
assert_equal "DisjointSetFinal" (List.sort compare !l |> List.map snd) [1; 2; 3; 4; 5; 6]
let () =
let take13 = List.map (fun (x, y, z) -> (x, z)) in
assert_equal "fix_arg_spec"
(fix_arg_spec [] "bla" |> take13)
[("-h", " Display this list of options."); ("-help", " "); ("--help", " ")] ;
assert_equal "fix_arg_spec"
(fix_arg_spec [("--foo", Arg.String ignore, "FOO fooling")] "bla" |> take13)
[ ("--foo", "FOO fooling")
; ("-h", " Display this list of options.")
; ("-help", " ")
; ("--help", " ") ]

@ -0,0 +1,106 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
module U = Utils
module P = Process
(* Needed as a (pointer-stable) default value for atd specs. *)
let empty_string = ""
let ydump ?(compact_json= false) ?(std_json= false) ic oc =
let cmd =
["ydump"] @ (if compact_json then ["-c"] else []) @ if std_json then ["-std"] else []
in
P.exec (Array.of_list cmd) ic oc stderr
let read_data_from_file reader fname =
let input_gunzipped read_data ic =
let pid, icz = P.fork (P.gunzip ic) in
let data = read_data icz in
let r = P.wait pid in
P.close_in icz ;
if not r then failwith "read_data_from_file (gunzip)" else () ;
data
in
let ic = open_in fname in
let data =
if U.string_ends_with fname ".value.gz" then input_gunzipped Marshal.from_channel ic
else if U.string_ends_with fname ".gz" then
input_gunzipped (Atdgen_runtime.Util.Json.from_channel ~fname reader) ic
else if U.string_ends_with fname ".value" then Marshal.from_channel ic
else Atdgen_runtime.Util.Json.from_channel ~fname reader ic
in
close_in ic ; data
let write_data_to_file ?(pretty= false) ?(compact_json= false) ?(std_json= false) writer fname data =
let output_gzipped write_data oc data =
let pid, icz = P.fork (fun ocz -> write_data ocz data ; true) in
let r1 = P.gzip icz oc and r2 = P.wait pid in
P.close_in icz ;
if not (r1 && r2) then failwith "write_data_to_file (gzip)" else ()
and output_pretty write_data oc data =
(* TODO(mathieubaudet): find out how to write directly pretty json? *)
let pid, icp = P.fork (fun ocp -> write_data ocp data ; true) in
let r1 = ydump ~compact_json ~std_json icp oc and r2 = P.wait pid in
P.close_in icp ;
if not (r1 && r2) then failwith "write_data_to_file (pretty)" else ()
in
let write_json ocx data =
if pretty then output_pretty (Atdgen_runtime.Util.Json.to_channel writer) ocx data
else Atdgen_runtime.Util.Json.to_channel writer ocx data
in
let oc = open_out fname in
if U.string_ends_with fname ".value.gz" then
output_gzipped (fun oc data -> Marshal.to_channel oc data []) oc data
else if U.string_ends_with fname ".value" then Marshal.to_channel oc data []
else if U.string_ends_with fname ".gz" then output_gzipped write_json oc data
else write_json oc data ;
close_out oc
let convert ?(pretty= false) ?(compact_json= false) ?(std_json= false) reader writer fin fout =
try
read_data_from_file reader fin
|> write_data_to_file writer ~pretty ~compact_json ~std_json fout
with
| Yojson.Json_error s | Atdgen_runtime.Oj_run.Error s ->
prerr_string s ; prerr_newline () ; exit 1
let run_converter_tool reader writer =
let pretty = ref false
and std_json = ref false
and compact_json = ref false
and files = ref [] in
let add_files x = files := x :: !files
and usage_msg =
"Usage: " ^ Sys.argv.(0) ^ "[OPTIONS] INPUT_FILE [OUTPUT_FILE]\n"
^ "Parse yojson values and convert them to another format based on the extension"
^ " of the output file (default: ${INPUT_FILE}.value.gz).\n"
in
let spec =
Utils.fix_arg_spec
[ ("--pretty", Arg.Set pretty, " Pretty print outputs.")
; ("--std", Arg.Set std_json, " Use standard json for outputs.")
; ("--compact", Arg.Set compact_json, " Use compact json for outputs.")
; ("--", Arg.Rest add_files, " Mark the end of options.") ] usage_msg
in
(* Parse the command line. *)
Arg.parse spec add_files usage_msg ;
let input, output =
match List.rev !files with
| [input] ->
(input, input ^ ".value.gz")
| [input; output] ->
(input, output)
| _ ->
prerr_string usage_msg ; exit 1
in
convert ~pretty:!pretty ~std_json:!std_json ~compact_json:!compact_json reader writer input
output

@ -0,0 +1,19 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
val read_data_from_file : 'a Atdgen_runtime.Util.Json.reader -> string -> 'a
val write_data_to_file :
?pretty:bool -> ?compact_json:bool -> ?std_json:bool -> 'a Atdgen_runtime.Util.Json.writer
-> string -> 'a -> unit
val ydump : ?compact_json:bool -> ?std_json:bool -> in_channel -> out_channel -> bool
val empty_string : string
val run_converter_tool :
'a Atdgen_runtime.Util.Json.reader -> 'a Atdgen_runtime.Util.Json.writer -> unit

@ -0,0 +1,24 @@
(*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open Clang_ast_j
open Yojson_utils
let data = {sl_file= Some "foo"; sl_line= Some 1; sl_column= None}
let basic_test pretty name =
write_data_to_file ~pretty write_source_location name data ;
let data3 = read_data_from_file read_source_location name in
Unix.unlink name ;
Utils.assert_equal (Printf.sprintf "test %s pretty=%b" name pretty) data data3
let files = List.map (( ^ ) "yojson_utils_test_tmpfile") [".gz"; ".value"; ".value.gz"; ".yjson"]
let test1 = List.iter (basic_test false) files
let test2 = List.iter (basic_test true) files

@ -0,0 +1,42 @@
#!/bin/bash
# Copyright (c) 2014-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
# Script to validate Yojson outputs w.r.t. ATD specifications.
# This works by running a given 'converter' to parse and pretty-print the outputs, then observing the difference with gunzip + pretty-print.
if [ "$2" == "--std" ]; then
CONVERTER=("$1" --std --pretty)
YDUMP=(ydump -std)
shift 2
else
CONVERTER=("$1" --pretty)
YDUMP=(ydump)
shift
fi
while [ -n "$1" ]
do
if [[ "$1" == *.gz ]]; then
DUMP_CMD=(gunzip -c "$1")
else
DUMP_CMD=(cat "$1")
fi
if ! diff -q <("${DUMP_CMD[@]}" | "${YDUMP[@]}") <("${CONVERTER[@]}" "$1" /dev/stdout) >/dev/null 2>&1; then
echo "The file '$1' does not respect the ATD format implemented by $CONVERTER."
echo "Here is the command that shows the problem:"
echo -n " diff <("
printf '%s ' "${DUMP_CMD[@]}"
echo -n "| "
printf '"%s" ' "${YDUMP[@]}"
echo -n ") <("
printf '"%s" ' "${CONVERTER[@]}" "$1"
echo "/dev/stdout)"
exit 2
fi
shift;
done

@ -0,0 +1,239 @@
#!/bin/bash
# Copyright (c) 2014-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
# Simple installation script for llvm/clang.
set -e
set -o pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SCRIPT_RELATIVE_PATH="$(basename "${BASH_SOURCE[0]}")"
CLANG_RELATIVE_SRC="src/llvm_clang_compiler-rt_libcxx_libcxxabi_openmp-9.0.0.tar.xz"
CLANG_SRC="$SCRIPT_DIR/$CLANG_RELATIVE_SRC"
CLANG_PREBUILD_PATCHES=(
"$SCRIPT_DIR/src/err_ret_local_block.patch"
"$SCRIPT_DIR/src/mangle_suppress_errors.patch"
"$SCRIPT_DIR/src/template_ambiguous.patch"
)
CLANG_PREFIX="$SCRIPT_DIR/install"
CLANG_INSTALLED_VERSION_FILE="$SCRIPT_DIR/installed.version"
PATCH=${PATCH:-patch}
STRIP=${STRIP:-strip}
NCPUS="$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo 2)"
JOBS="${JOBS:-$(($NCPUS>=8?$NCPUS/4:2))}"
SHASUM=${SHASUM:-shasum -a 256}
usage () {
echo "Usage: $0 [-chr]"
echo
echo " options:"
echo " -c,--only-check-install check if recompiling clang is needed"
echo " -h,--help show this message"
echo " -n,--ninja use ninja for building"
echo " -r,--only-record-install do not install clang but pretend we did"
echo " -s,--sequential-link only use one process for linking (ninja only)"
}
check_installed () {
pushd "$SCRIPT_DIR" > /dev/null
$SHASUM -c "$CLANG_INSTALLED_VERSION_FILE" >& /dev/null
local result=$?
popd > /dev/null
return $result
}
record_installed () {
pushd "$SCRIPT_DIR" > /dev/null
$SHASUM "$CLANG_RELATIVE_SRC" "$SCRIPT_RELATIVE_PATH" > "$CLANG_INSTALLED_VERSION_FILE"
popd > /dev/null
}
ONLY_CHECK=
ONLY_RECORD=
USE_NINJA=
SEQUENTIAL_LINK=
while [[ $# -gt 0 ]]; do
opt_key="$1"
case $opt_key in
-c|--only-check-install)
ONLY_CHECK=yes
shift
continue
;;
-r|--only-record-install)
ONLY_RECORD=yes
shift
continue
;;
-n|--ninja)
USE_NINJA=yes
shift
continue
;;
-s|--sequential-link)
SEQUENTIAL_LINK=yes
shift
continue
;;
-h|--help)
usage
exit 0
;;
*)
usage
exit 2
esac
shift
done
if [ "$ONLY_RECORD" = "yes" ]; then
record_installed
exit 0
fi
if check_installed; then
# already installed
if [ "$ONLY_CHECK" = "yes" ]; then
exit 0
fi
echo "Clang is already installed according to $CLANG_INSTALLED_VERSION_FILE"
echo "Nothing to do, exiting."
exit 0
else
if [ "$ONLY_CHECK" = "yes" ]; then
exit 1
fi
fi
set -x
if [[ x"$MAKEFLAGS" != x ]]; then
echo "WARNING: MAKEFLAGS var was set to: $MAKEFLAGS"
echo " which may (and will!) interfere with the setup"
echo " ... ignoring MAKEFLAGS."
unset MAKEFLAGS
fi
if [[ x"$DESTDIR" != x ]]; then
echo "WARNING: DESTDIR var was set to: $DESTDIR"
echo " but the setup script is not designed to handle"
echo " relocation of the installation."
echo " ... ignoring DESTDIR."
unset DESTDIR
fi
platform=`uname`
CMAKE_ARGS=(
-DCMAKE_INSTALL_PREFIX="$CLANG_PREFIX"
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_C_FLAGS="$CFLAGS $CMAKE_C_FLAGS"
-DCMAKE_CXX_FLAGS="$CXXFLAGS $CMAKE_CXX_FLAGS"
-DLLVM_ENABLE_ASSERTIONS=Off
-DLLVM_ENABLE_EH=On
-DLLVM_ENABLE_RTTI=On
-DLLVM_INCLUDE_DOCS=Off
-DLLVM_TARGETS_TO_BUILD="X86;AArch64;ARM;Mips"
-DLLVM_BUILD_EXTERNAL_COMPILER_RT=On
)
if [ "$platform" = "Darwin" ]; then
CMAKE_ARGS+=(
-DLLVM_ENABLE_LIBCXX=On
-DCMAKE_SHARED_LINKER_FLAGS="$LDFLAGS $CMAKE_SHARED_LINKER_FLAGS"
-DLLVM_BUILD_LLVM_DYLIB=ON
)
else
CMAKE_ARGS+=(
-DCMAKE_SHARED_LINKER_FLAGS="$LDFLAGS $CMAKE_SHARED_LINKER_FLAGS -lstdc++ -fPIC"
)
fi
if [ "$USE_NINJA" = "yes" ]; then
CMAKE_GENERATOR="Ninja"
BUILD_BIN="ninja"
# Do not set a 'j' build default for Ninja (let Ninja decide)
BUILD_ARGS=""
else
CMAKE_GENERATOR="Unix Makefiles"
BUILD_BIN="make"
BUILD_ARGS="-j $JOBS"
fi
if [ "$SEQUENTIAL_LINK" = "yes" ]; then
if [[ x"$USE_NINJA" = x ]]; then
echo "Linking with a single process is only supported with the Ninja generator."
echo "Unable to proceed, exiting."
exit 1
fi
# For Ninja, the compile jobs is the number of CPUs *not* $JOBS
CMAKE_ARGS+=(
-DCMAKE_JOB_POOLS:STRING="compile=$NCPUS;link=1"
-DCMAKE_JOB_POOL_COMPILE:STRING="compile"
-DCMAKE_JOB_POOL_LINK:STRING="link"
)
fi
# start the installation
if [ -n "$CLANG_TMP_DIR" ]; then
TMP=$CLANG_TMP_DIR
else
TMP=`mktemp -d /tmp/clang-setup.XXXXXX`
fi
pushd "$TMP"
if tar --version | grep -q 'GNU'; then
# GNU tar is too verbose if the tarball was created on MacOS
QUIET_TAR="--warning=no-unknown-keyword"
fi
echo "unpacking '$CLANG_SRC'..."
tar --extract $QUIET_TAR --file "$CLANG_SRC"
# apply prebuild patch
for PATCH_FILE in ${CLANG_PREBUILD_PATCHES[*]}; do
"$PATCH" --batch -p 1 < "$PATCH_FILE"
done
mkdir -p build
pushd build
# workaround install issue with ocaml llvm bindings and ocamldoc
mkdir -p docs/ocamldoc/html
cmake -G "$CMAKE_GENERATOR" ../llvm "${CMAKE_ARGS[@]}" $CLANG_CMAKE_ARGS
$BUILD_BIN $BUILD_ARGS
echo "testing clang build"
./bin/clang --version
# "uninstall" previous clang
rm -fr "$CLANG_PREFIX"
$BUILD_BIN $BUILD_ARGS install
popd # build
popd # $TMP
# brutally strip everything, ignore errors
set +e
find "$CLANG_PREFIX"/{bin,lib} -type f -exec "$STRIP" -x \{\} \;
set -e
echo "testing installed clang"
"$CLANG_PREFIX"/bin/clang --version
echo "deleting temp dir '$CLANG_TMP_DIR'..."
if [ -n "$CLANG_TMP_DIR" ]; then
rm -rf "$TMP/*"
else
rm -rf "$TMP"
fi
record_installed

@ -0,0 +1,31 @@
= LLVM+Clang 9.0.0 -- official release
Downloaded from http://releases.llvm.org/download.html#9.0.0
Included components:
$ sha256sum *.tar.xz
7ba81eef7c22ca5da688fdf9d88c20934d2d6b40bfe150ffd338900890aa4610 cfe-9.0.0.src.tar.xz
56e4cd96dd1d8c346b07b4d6b255f976570c6f2389697347a6c3dcb9e820d10e compiler-rt-9.0.0.src.tar.xz
3c4162972b5d3204ba47ac384aa456855a17b5e97422723d4758251acf1ed28c libcxx-9.0.0.src.tar.xz
675041783565c906ac2f7f8b2bc5c40f14d871ecfa8ade34855aa18de95530e9 libcxxabi-9.0.0.src.tar.xz
d6a0565cf21f22e9b4353b2eb92622e8365000a9e90a16b09b56f8157eabfe84 llvm-9.0.0.src.tar.xz
9979eb1133066376cc0be29d1682bc0b0e7fb541075b391061679111ae4d3b5b openmp-9.0.0.src.tar.xz
Script to build the archive:
tar xf llvm-9.0.0.src.tar.xz
cd llvm-9.0.0.src/tools/
tar xf ../../cfe-9.0.0.src.tar.xz
mv cfe-9.0.0.src/ clang
cd ../projects/
tar xf ../../compiler-rt-9.0.0.src.tar.xz
mv compiler-rt-9.0.0.src/ compiler-rt
tar xf ../../libcxx-9.0.0.src.tar.xz
mv libcxx-9.0.0.src/ libcxx
tar xf ../../libcxxabi-9.0.0.src.tar.xz
mv libcxxabi-9.0.0.src/ libcxxabi
tar xf ../../openmp-9.0.0.src.tar.xz
mv openmp-9.0.0.src/ openmp
cd ../..
mv llvm-9.0.0.src llvm
tar cJ llvm > llvm_clang_compiler-rt_libcxx_libcxxabi_openmp-9.0.0.tar.xz

@ -0,0 +1,13 @@
--- a/llvm/tools/clang/lib/Sema/SemaInit.cpp
+++ b/llvm/tools/clang/lib/Sema/SemaInit.cpp
@@ -7147,7 +7147,9 @@ void Sema::checkInitializerLifetime(const InitializedEntity &Entity,
<< Entity.getType()->isReferenceType() << DRE->getDecl()
<< isa<ParmVarDecl>(DRE->getDecl()) << DiagRange;
} else if (isa<BlockExpr>(L)) {
- Diag(DiagLoc, diag::err_ret_local_block) << DiagRange;
+ // Don't throw this error during Infer runs
+ // Diag(DiagLoc, diag::err_ret_local_block) << DiagRange;
+ return false;
} else if (isa<AddrLabelExpr>(L)) {
// Don't warn when returning a label from a statement expression.
// Leaving the scope doesn't end its lifetime.

@ -0,0 +1,77 @@
--- a/llvm/tools/clang/lib/AST/ItaniumMangle.cpp
+++ b/llvm/tools/clang/lib/AST/ItaniumMangle.cpp
@@ -3048,11 +3048,7 @@ void CXXNameMangler::mangleNeonVectorType(const VectorType *T) {
}
void CXXNameMangler::mangleNeonVectorType(const DependentVectorType *T) {
- DiagnosticsEngine &Diags = Context.getDiags();
- unsigned DiagID = Diags.getCustomDiagID(
- DiagnosticsEngine::Error,
- "cannot mangle this dependent neon vector type yet");
- Diags.Report(T->getAttributeLoc(), DiagID);
+ Out << "__unhandled_NeonVectorType";
}
static StringRef mangleAArch64VectorBase(const BuiltinType *EltType) {
@@ -3123,11 +3119,7 @@ void CXXNameMangler::mangleAArch64NeonVectorType(const VectorType *T) {
Out << TypeName.length() << TypeName;
}
void CXXNameMangler::mangleAArch64NeonVectorType(const DependentVectorType *T) {
- DiagnosticsEngine &Diags = Context.getDiags();
- unsigned DiagID = Diags.getCustomDiagID(
- DiagnosticsEngine::Error,
- "cannot mangle this dependent neon vector type yet");
- Diags.Report(T->getAttributeLoc(), DiagID);
+ Out << "__unhandled_AArch64NeonVectorType";
}
// GNU extension: vector types
@@ -3626,12 +3618,7 @@ recurse:
case Expr::BuiltinBitCastExprClass:
{
if (!NullOut) {
- // As bad as this diagnostic is, it's better than crashing.
- DiagnosticsEngine &Diags = Context.getDiags();
- unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
- "cannot yet mangle expression type %0");
- Diags.Report(E->getExprLoc(), DiagID)
- << E->getStmtClassName() << E->getSourceRange();
+ Out << "__unhandled_expression";
}
break;
}
@@ -3652,12 +3639,7 @@ recurse:
// Even gcc-4.5 doesn't mangle this.
case Expr::BinaryConditionalOperatorClass: {
- DiagnosticsEngine &Diags = Context.getDiags();
- unsigned DiagID =
- Diags.getCustomDiagID(DiagnosticsEngine::Error,
- "?: operator with omitted middle operand cannot be mangled");
- Diags.Report(E->getExprLoc(), DiagID)
- << E->getStmtClassName() << E->getSourceRange();
+ Out << "__unhandled_BinaryConditionalOperatorClass";
break;
}
@@ -3952,18 +3934,11 @@ recurse:
Out << 'a';
break;
case UETT_VecStep: {
- DiagnosticsEngine &Diags = Context.getDiags();
- unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
- "cannot yet mangle vec_step expression");
- Diags.Report(DiagID);
+ Out << "__unhandled_VecStep";
return;
}
case UETT_OpenMPRequiredSimdAlign: {
- DiagnosticsEngine &Diags = Context.getDiags();
- unsigned DiagID = Diags.getCustomDiagID(
- DiagnosticsEngine::Error,
- "cannot yet mangle __builtin_omp_required_simd_align expression");
- Diags.Report(DiagID);
+ Out << "__unhandled_UETT_OpenMPRequiredSimdAlign";
return;
}
}

@ -0,0 +1,12 @@
--- a/llvm/tools/clang/lib/Sema/SemaTemplate.cpp
+++ b/llvm/tools/clang/lib/Sema/SemaTemplate.cpp
@@ -441,9 +441,6 @@ bool Sema::LookupTemplateName(LookupResult &Found,
IsDependent |= Found.wasNotFoundInCurrentInstantiation();
}
- if (Found.isAmbiguous())
- return false;
-
if (ATK && !SS.isSet() && ObjectType.isNull() && TemplateKWLoc.isInvalid()) {
// C++2a [temp.names]p2:
// A name is also considered to refer to a template if it is an

@ -0,0 +1,33 @@
/**
* Copyright (c) 2014, Facebook, Inc.
* Copyright (c) 2003-2014 University of Illinois at Urbana-Champaign.
* All rights reserved.
*
* This file is distributed under the University of Illinois Open Source
* License.
* See LLVM-LICENSE for details.
*
*/
/**
* Clang frontend plugin to export an AST of clang into Json, Yojson and Biniou
* while conforming to the inlined ATD specifications.
*/
#include "ASTExporter.h"
//===----------------------------------------------------------------------===//
// ASTExporter Plugin
//===----------------------------------------------------------------------===//
static ASTLib::FrontendPluginRegistry::Add<ASTLib::JsonExporterASTAction> X(
"JsonASTExporter",
"Export the AST of source files into ATD-specified Json data");
static ASTLib::FrontendPluginRegistry::Add<ASTLib::YojsonExporterASTAction> Y(
"YojsonASTExporter",
"Export the AST of source files into ATD-specified Yojson data");
static ASTLib::FrontendPluginRegistry::Add<ASTLib::BiniouExporterASTAction> Z(
"BiniouASTExporter",
"Export the AST of source files into ATD-specified biniou data");

File diff suppressed because it is too large Load Diff

@ -0,0 +1,279 @@
Guidelines for writing ATD annotations in ASTExporter.cpp
=========================================================
The ATD specifications inlined in ASTExporter.cpp are used to generate Ocaml parsers using `atdgen`. Those annotations must reflect
closely the Yojson/Json/Biniou emitted by the C++ plugin.
The ATD language and the parser generating tool `atdgen` are documented here:
https://atd.readthedocs.io/en/latest/atdgen.html
ATD basics
----------
The definition of object in ASTExporter.cpp typically look like this:
```
//@atd type record = {
//@atd mandatory_field : string
//@atd ?optional_int : int option
//@atd ~string_empty_by_default : string
//@atd } <ocaml field_prefix="r_">
```
Each line of ATD definitions must start with `//@atd`-style comments.
The `?` symbols mean that an absent field is ok and maps to the ocaml value `None`.
The `~` symbols mean that an absent field is ok and maps to some default value for this type.
The `<ocaml field_prefix="r_">` annotations are currently required to disambiguate records on the ocaml side. The prefix should be
made the first letters of the C++ types, except for a few exceptions (e.g. `CXX` is mapped to `x`).
Valid Yojson values for this specification are for instance:
```
{ "mandatory_field" : "foo" }
{ "mandatory_field" : "foo", "optional_int" : 3 }
```
Simple example
--------------
```
//@atd type source_location = {
//@atd ?file : string option;
//@atd ?line : int option;
//@atd ?column : int option;
//@atd } <ocaml field_prefix="sl_">
template <class ATDWriter>
void ASTExporter<ATDWriter>::dumpSourceLocation(SourceLocation Loc) {
SourceLocation SpellingLoc = SM.getSpellingLoc(Loc);
PresumedLoc PLoc = SM.getPresumedLoc(SpellingLoc);
if (PLoc.isInvalid()) {
// Outputs an object. The closing brace will be added when 'Scope' is destroyed.
// This is typical in C++ : http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
// Second argument encodes size of an object. In this case there are 0 tags exported
ObjectScope Scope(OF, 0);
// Early return is ok because all fields are optional.
// return will destroy Scope and add closing brace
return;
}
// There are at most 3 tags exported in this case. It's ok to specify upper bound
// on the size of the object. It will be correct, but inefficient.
ObjectScope Scope(OF, 3);
if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) {
// emits the tag of the field 'file'
OF.emitTag("file");
// emits a string (since we do emit something, the ocaml value is 'Some (...)')
OF.emitString(PLoc.getFilename());
OF.emitTag("line");
OF.emitInteger(PLoc.getLine());
OF.emitTag("column");
OF.emitInteger(PLoc.getColumn());
}
} // Scope gets destroyed here and adds closing brace
```
Note that parser expects the C++ code to emit the corresponding fields in the same order.
More complex example
--------------------
To get types of AST nodes, exporter relies on generated header files from clang.
```
//@atd type decl_ref = {
//@atd kind : decl_kind; (* ATD type declared below *)
//@atd ?name : string;
//@atd ~is_hidden : bool;
//@atd ?qual_type : qual_type option
//@atd } <ocaml field_prefix="dr_">
//@atd
//@atd type decl_kind = [
// define macros used in clang/AST/DeclNodes.inc to produce ATD annotations
#define DECL(DERIVED, BASE) //@atd | DERIVED
#define ABSTRACT_DECL(DECL) DECL
// clang/AST/DeclNodes.inc file contains all possible Decl nodes
#include <clang/AST/DeclNodes.inc>
//@atd ]
template <class ATDWriter>
void ASTExporter<ATDWriter>::dumpBareDeclRef(const Decl &D) {
const NamedDecl *ND = dyn_cast<NamedDecl>(&D);
bool isHidden = ND ? ND->isHidden() : false;
const ValueDecl *VD = dyn_cast<ValueDecl>(&D);
// specify exact size of the scope.
ObjectScope Scope(OF, 1 + (bool)ND + isHidden + (bool)VD);
OF.emitTag("kind");
// case of an algebraic datatype that carries no value (like a C enum field)
OF.emitSimpleVariant(D.getDeclKindName());
// ok not to output anything because the field is optional
if (ND) {
OF.emitTag("name");
OF.emitString(ND->getNameAsString());
// flags correspond to ATD fields of the form "~tag : bool"
OF.emitFlag("is_hidden", ND->isHidden());
}
// ok not to output anything because the field is optional
if (VD) {
OF.emitTag("qual_type");
dumpQualType(VD->getType()); // will emit value for a QualType
}
}
```
The complex definition for decl_kind is processed in several stages.
First we use an adequate node of the clang preprocessor and expand the `#include <clang/AST/DeclNodes.inc>` to following code:
```
//@atd type decl_kind = [
//@atd | AccessSpec
//@atd | Block
//@atd | Captured
//@atd (* ... *)
//@atd ]
```
Then we extract the ATD specifications by looking for `//@atd`-style comments
```
type decl_kind = [
| AccessSpec
| Block
| Captured
(* ... *)
]
```
After calling `atdgen`, the final Ocaml type is:
```
type decl_kind = `AccessSpec | `Block | `Captured | `ClassScopeFunctionSpecialization (* ... *)
```
Testing
-------
Compiling with `DEBUG=1` will make the ATDWriter enforce the general well-formedness of the emitted Yojson/Json/Biniou. For instance, a missing tag will trigger an assert failure.
Discrepancies between annotations and emitted values are detected by the tests in `../clang-ocaml`.
It's is important to test both exporter (`make test`) and atd annotations (`make -C ../clang-ocaml test`)
When changing the exporter, sometimes tests will fail due to exporting new information. To record this fact, run `make record-test-outputs`
Mapping clang AST nodes to ocaml values
---------------------------------------
Clang AST entities of a given type are typically represented by a cluster of classes.
For instance, here is the cluster for declarations: http://clang.llvm.org/doxygen/classclang_1_1Decl.html
Function declaration: https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html
To map these entities to a flat algebraic data type of Ocaml (serialized as a "variant" by ATDWriter), as seen
before, we heavily rely on a (hacky) C-preprocessing stage and several scripts. They can be found in `atdlib` directory.
Let us study how declarations are handled more precisely. Handling for statement and type nodes is very similar.
##### Default values for node tuples
```
#define DECL(DERIVED, BASE) //@atd #define @DERIVED@_decl_tuple @BASE@_tuple
#define ABSTRACT_DECL(DECL) DECL
#include <clang/AST/DeclNodes.inc>
```
After one step of preprocessing + ATD-extraction, this creates the following intermediate code (see `build/ast_inline.atd.inc`)
```
#define access_spec_decl_tuple decl_tuple
#define block_decl_tuple decl_tuple
#define captured_decl_tuple decl_tuple
// ...
#define named_decl_tuple decl_tuple
#define decl_context_tuple decl list * decl_context_info
```
This defines the default value of each `xxxx_decl_tuple` to be that of the base class.
The `@...@` signs are processed by python macros in `libtooling/atdlib`. For instance, `@CaptureDecl@` gives `capture_decl`.
##### Overriding node tuples when outputting data
When the visiting method for nodes of given type is effectively written, it is expected that the
corresponding `#define xxxx_decl_tuple` is overwritten to add the specific information of the kind of nodes.
It is important to name tuples correctly. For example, for `SomeNewNodeDecl`, tuple needs to be named as `some_new_node_decl_tuple`. Failure to name them exactly like this will result in picking up default value for tuple node instead of overridden one.
It is also required to specify how many fields tuple for given node has via `XxxTupleSize()` method
```
//@atd #define decl_tuple decl_info
//@atd type decl_info = {
//@atd (* ... *)
//@atd } <ocaml field_prefix="di_">
template <class ATDWriter>
int ASTExporter<ATDWriter>::DeclTupleSize() {
return 1; // decl_tuple has size of 1 (decl_info)
}
// Decl is the top class. Everything here concerns all declarations nodes.
template <class ATDWriter>
void ASTExporter<ATDWriter>::VisitDecl(const Decl *D) {
// ...
}
//@atd #define named_decl_tuple decl_tuple * string (* must start with the tuple of the base class *)
template <class ATDWriter>
int ASTExporter<ATDWriter>::NamedDeclTupleSize() {
return DeclTupleSize() + 1; // named_decl_tuple has size of decl_tuple + 1 (for string field)
}
// Some important intermediate abstract class NamedDecl.
template <class ATDWriter>
void ASTExporter<ATDWriter>::VisitNamedDecl(const NamedDecl *D) {
// Must visit the base class to output its tuple of information.
VisitDecl(D);
// Extra information for the derived class.
OF.emitString(D->getNameAsString());
}
```
##### Putting everything together
The final definitions of the `xxx_decl_tuple` are meant to be inlined in the declaration of the actual sum type for all declarations.
```
// main variant for declarations
//@atd type decl = [
#define DECL(DERIVED, BASE) //@atd | DERIVED@@Decl of (@DERIVED@_decl_tuple)
#define ABSTRACT_DECL(DECL)
#include <clang/AST/DeclNodes.inc>
//@atd ]
```
This expands first to: (see `build/ast_inline.atd.p`)
```
type decl = [
| AccessSpecDecl of (access_spec_decl_tuple)
| BlockDecl of (block_decl_tuple)
| CapturedDecl of (captured_decl_tuple)
| ClassScopeFunctionSpecializationDecl of (class_scope_function_specialization_decl_tuple)
(* ... *)
]
```
Then after a last stage of preprocessing: (see `build/clang_ast.atd`)
```
type decl = [
AccessSpecDecl of (decl_info)
| BlockDecl
of (decl_info * decl list * decl_context_info * block_decl_info)
| CapturedDecl of (decl_info * decl list * decl_context_info)
| ClassScopeFunctionSpecializationDecl of (decl_info)
(* ... *)
]
```

@ -0,0 +1,37 @@
/*
* Copyright (c) 2015-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "AttrParameterVectorStream.h"
#include <llvm/Support/raw_ostream.h>
namespace ASTLib {
AttrParameterVectorStream &AttrParameterVectorStream::operator<<(
const std::string &str) {
// hack to get rid of spurious leading " "s
if (str != " ") {
Content.push_back(str);
}
return *this;
}
AttrParameterVectorStream &AttrParameterVectorStream::operator<<(
const unsigned int x) {
return operator<<(std::to_string(x));
}
AttrParameterVectorStream &AttrParameterVectorStream::operator<<(
const llvm::VersionTuple &verTup) {
return operator<<(verTup.getAsString());
}
const std::vector<std::string> &AttrParameterVectorStream::getContent() {
return Content;
}
} // end of namespace ASTLib

@ -0,0 +1,31 @@
/*
* Copyright (c) 2015-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <llvm/Support/VersionTuple.h>
#include <string>
#include <vector>
namespace ASTLib {
class AttrParameterVectorStream {
private:
std::vector<std::string> Content;
public:
AttrParameterVectorStream() {}
AttrParameterVectorStream &operator<<(const std::string &str);
AttrParameterVectorStream &operator<<(const unsigned int x);
AttrParameterVectorStream &operator<<(const llvm::VersionTuple &verTup);
const std::vector<std::string> &getContent();
};
} // end of namespace ASTLib

@ -0,0 +1,95 @@
/*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include <clang/AST/AST.h>
#include <llvm/ADT/SmallVector.h>
#include <llvm/Support/Path.h>
#include <vector>
#include "FileUtils.h"
namespace FileUtils {
/**
* Simplify away "." and ".." elements.
* If pathToNormalize is a relative path, it will be pre-pended with
* currentWorkingDirectory unless currentWorkingDirectory == "".
*/
std::string makeAbsolutePath(const std::string &currentWorkingDirectory,
std::string path) {
llvm::SmallVector<char, 16> result;
std::vector<std::string> elements;
int skip = 0;
if (llvm::sys::path::is_relative(path)) {
// Prepend currentWorkingDirectory to path (unless currentWorkingDirectory
// is empty).
llvm::SmallVector<char, 16> vec(currentWorkingDirectory.begin(),
currentWorkingDirectory.end());
llvm::sys::path::append(vec, path);
path = std::string(vec.begin(), vec.end());
} else {
// Else copy the separator to maintain an absolute path.
result.append(1, path.front());
}
elements.push_back(llvm::sys::path::filename(path));
while (llvm::sys::path::has_parent_path(path)) {
path = llvm::sys::path::parent_path(path);
const std::string &element(llvm::sys::path::filename(path));
if (element == ".") {
continue;
}
if (element == "..") {
skip++;
continue;
}
if (skip > 0) {
skip--;
continue;
}
elements.push_back(element);
}
while (skip > 0) {
elements.push_back("..");
skip--;
}
for (auto I = elements.rbegin(), E = elements.rend(); I != E; I++) {
llvm::sys::path::append(result, *I);
}
return std::string(result.begin(), result.end());
}
std::string makeRelativePath(const std::string &repoRoot,
const std::string &sysRoot,
bool keepExternalPaths,
bool allowSiblingsToRepoRoot,
const std::string &path) {
if (repoRoot != "") {
if (llvm::StringRef(path).startswith(repoRoot + "/")) {
return path.substr(repoRoot.size() + 1);
}
if (allowSiblingsToRepoRoot) {
std::string parentOfRoot = llvm::sys::path::parent_path(repoRoot);
if (llvm::StringRef(path).startswith(parentOfRoot + "/")) {
return "../" + path.substr(parentOfRoot.size() + 1);
}
}
}
if (sysRoot != "" && llvm::StringRef(path).startswith(sysRoot + "/")) {
// Intentionally keep the heading "/" in this case.
return path.substr(sysRoot.size());
}
if (keepExternalPaths) {
return path;
}
return "";
}
} // namespace FileUtils

@ -0,0 +1,34 @@
/*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <clang/AST/Decl.h>
#include <string>
namespace FileUtils {
/**
* Simplify away "." and ".." elements.
* If pathToNormalize is a relative path, it will be pre-pended with
* currentWorkingDirectory unless currentWorkingDirectory == "".
*/
std::string makeAbsolutePath(const std::string &currentWorkingDirectory,
std::string path);
/**
* Try to delete a prefix "repoRoot/" OR "sysRoot" from the given absolute path.
* If no rule applies AND keepExternalPaths is true, return the same path,
* otherwise return the empty string.
*/
std::string makeRelativePath(const std::string &repoRoot,
const std::string &sysRoot,
bool keepExternalPaths,
bool allowSiblingsToRoot,
const std::string &path);
} // namespace FileUtils

@ -0,0 +1,158 @@
# Copyright (c) 2014-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
.PHONY: clean all test all_ast_samples
LEVEL=..
include $(LEVEL)/Makefile.common
HEADERS+=SimplePluginASTAction.h FileUtils.h AttrParameterVectorStream.h
OBJS+=SimplePluginASTAction.o FileUtils.o AttrParameterVectorStream.o
# ASTExporter
HEADERS+=atdlib/ATDWriter.h ASTExporter.h NamePrinter.h
OBJS+=ASTExporter.o
# Json
PLUGINS+=JsonASTExporter
EXTS+=.json
# Yojson
PLUGINS+=YojsonASTExporter
EXTS+=.yjson
# biniou
BINIOU_PLUGIN=BiniouASTExporter
PLUGINS+=$(BINIOU_PLUGIN)
EXTS+=.biniou
all: build/FacebookClangPlugin.dylib build/ast_exporter_bin
include $(LEVEL)/Makefile.rules
CLANG_FRONTEND=$(CLANG) -fsyntax-only -Xpreprocessor -detailed-preprocessing-record -Xclang -load -Xclang $(shell pwd)/build/FacebookClangPlugin.dylib
build/FacebookClangPlugin.dylib: $(OBJS:%=build/%) $(HEADERS)
@mkdir -p build
$(CXX) $(LDFLAGS_DYLIB) -o $@ $(OBJS:%=build/%) -lz -lpthread -lm
# Experimental tool. This requires clang static libraries.
AST_EXPORTER_OBJS=ast_exporter_bin.o SimplePluginASTAction.o FileUtils.o AttrParameterVectorStream.o
build/ast_exporter_bin: $(AST_EXPORTER_OBJS:%=build/%) $(HEADERS)
@mkdir -p build
$(CXX) -o $@ $(AST_EXPORTER_OBJS:%=build/%) $(LDFLAGS) $(LLVM_CXXFLAGS) $(CLANG_TOOL_LIBS) $(LLVM_LDFLAGS) -lz -lpthread -lm
TEST_DIRS=tests
OUT_TEST_FILES=${TEST_DIRS:%=%/*/*.out}
# To make sharing of test files easier, each source file should be
# found in 'tests'. A plugin will only use the source files for which
# a .exp file exists in the corresponding subdirectory.
EXPFILES_FORMULA=tests/$$P/*.exp
SRCFILE_FORMULA=tests/$$(basename $$TEST)
FILTERFILE_FORMULA=tests/$${P}/filter.sh
test: build/FacebookClangPlugin.dylib
@for P in $(PLUGINS); do \
if [ "$$P" == "BiniouASTExporter" ] && ! hash bdump 2>/dev/null; \
then continue; \
fi; \
echo "-- $$P --"; \
export CLANG_FRONTEND_PLUGIN__AST_WITH_POINTERS=0; \
rm -rf build/tmp_$$P; \
mkdir -p build/tmp_$$P; \
for EXPFILE in $(EXPFILES_FORMULA); do \
TEST=$${EXPFILE%.exp}; \
EXTRA_FLAGS=""; \
case "$(SRCFILE_FORMULA)" in \
*.m ) \
if [ "$(HAS_OBJC)" = "no" ]; then \
printf "[~] %s skipped (no Objective-C support)\n" \
"$$(basename $(SRCFILE_FORMULA))"; \
continue; \
fi; \
EXTRA_FLAGS="-ObjC -fblocks $(IOSFLAGS)"; \
;; \
*.cpp ) \
EXTRA_FLAGS="--std=c++14"; \
;; \
*.mm ) \
EXTRA_FLAGS="--std=c++14 -ObjC++ -fblocks $(IOSFLAGS)"; \
;; \
esac; \
$(RUNTEST) "$$TEST" $(FILTERFILE_FORMULA) \
$(CLANG_FRONTEND) $$EXTRA_FLAGS -Xclang -plugin -Xclang $$P \
-Xclang -plugin-arg-$$P -Xclang - \
-Xclang -plugin-arg-$$P -Xclang USE_TEMP_DIR_FOR_DEDUPLICATION=build/tmp_$$P \
-c $(SRCFILE_FORMULA); \
done; \
done
@if [ ! $$KEEP_TEST_OUTPUTS ]; then rm -f $(OUT_TEST_FILES); fi
record-test-outputs:
@$(MAKE) DEBUG=1 KEEP_TEST_OUTPUTS=1 test || true
@for F in $(OUT_TEST_FILES); do cp $$F $${F%.out}.exp; done
@rm -f $(OUT_TEST_FILES)
clean:
@rm -rf build/* $(OUT_TEST_FILES)
# -- AST samples for specific end-to-end tests --
REGULAR_SOURCES=$(wildcard tests/*.m) $(wildcard tests/*.c) $(wildcard tests/*.cpp) $(wildcard tests/*.mm)
AST_SAMPLE_FILES=ASTExporter.cpp $(REGULAR_SOURCES:tests/%=%)
all_ast_samples: $(AST_SAMPLE_FILES:%=build/ast_samples/%.json.gz) $(AST_SAMPLE_FILES:%=build/ast_samples/%.yjson.gz)
# dump samples files in Yojson using ASTExporter.cpp
YJ_DUMPER_ARGS=-Xclang -plugin -Xclang YojsonASTExporter -Xclang -plugin-arg-YojsonASTExporter -Xclang
build/ast_samples/%.cpp.yjson: %.cpp build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) $(CFLAGS) -Wno-ignored-qualifiers -I. $(YJ_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.cpp.yjson: tests/%.cpp build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) --std=c++14 $(YJ_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.c.yjson: tests/%.c build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) $(YJ_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.m.yjson: tests/%.m build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) $(IOSFLAGS) $(YJ_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.mm.yjson: tests/%.mm build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) --std=c++14 $(IOSFLAGS) $(YJ_DUMPER_ARGS) $@ -c $<
# dump sample files in Yojson using ASTExporter.cpp
J_DUMPER_ARGS=-Xclang -plugin -Xclang JsonASTExporter -Xclang -plugin-arg-JsonASTExporter -Xclang
build/ast_samples/%.cpp.json: %.cpp build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) $(CFLAGS) -Wno-ignored-qualifiers -I. $(J_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.cpp.json: tests/%.cpp build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) --std=c++14 $(J_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.c.json: tests/%.c build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) $(J_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.m.json: tests/%.m build/FacebookClangPlugin.dylib
@mkdir -p build/ast_samples
$(CLANG_FRONTEND) $(IOSFLAGS) $(J_DUMPER_ARGS) $@ -c $<
build/ast_samples/%.gz: build/ast_samples/%
@gzip -f < $< > $@
# generate a preprocessed version of ASTExporter.cpp where ATD directives can be read
# we do not include the C/C++ headers to avoid parsing issues with the 'traditional' cpp (needed for precisely expanding our /// comments)
build/ASTExporter.h.p: ASTExporter.h
@mkdir -p build
@cat $< | grep -v '#include *["<][^.]*\(\.h\)\?[">]' | $(ATD_CPP) -I$(CLANG_PREFIX)/include > $@

@ -0,0 +1,194 @@
/*
* Copyright (c) 2016-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <clang/AST/DeclVisitor.h>
#include <clang/Basic/SourceManager.h>
#include "atdlib/ATDWriter.h"
namespace ASTLib {
using namespace clang;
template <class ATDWriter>
class NamePrinter : public ConstDeclVisitor<NamePrinter<ATDWriter>> {
typedef typename ATDWriter::ObjectScope ObjectScope;
typedef typename ATDWriter::ArrayScope ArrayScope;
typedef typename ATDWriter::TupleScope TupleScope;
typedef typename ATDWriter::VariantScope VariantScope;
const SourceManager &SM;
ATDWriter &OF;
PrintingPolicy getPrintingPolicy();
void printTemplateArgList(llvm::raw_ostream &OS,
const ArrayRef<TemplateArgument> Args);
public:
NamePrinter(const SourceManager &SM, ATDWriter &OF) : SM(SM), OF(OF) {}
// implementation is inspired by NamedDecl::printQualifiedName
// but with better handling for anonymous structs,unions and namespaces
void printDeclName(const NamedDecl &D);
void VisitNamedDecl(const NamedDecl *D);
void VisitNamespaceDecl(const NamespaceDecl *ND);
void VisitTagDecl(const TagDecl *TD);
void VisitFunctionDecl(const FunctionDecl *FD);
};
// 64 bits fnv-1a
const uint64_t FNV64_hash_start = 14695981039346656037ULL;
const uint64_t FNV64_prime = 1099511628211ULL;
uint64_t fnv64Hash(const char *s, int n) {
uint64_t hash = FNV64_hash_start;
for (int i = 0; i < n; ++i) {
hash ^= s[i];
hash *= FNV64_prime;
}
return hash;
}
uint64_t fnv64Hash(llvm::raw_svector_ostream &OS) {
std::string s = OS.str();
return fnv64Hash(s.data(), s.size());
}
const int templateLengthThreshold = 40;
template <class ATDWriter>
void NamePrinter<ATDWriter>::printTemplateArgList(
llvm::raw_ostream &OS, const ArrayRef<TemplateArgument> Args) {
SmallString<64> Buf;
llvm::raw_svector_ostream tmpOS(Buf);
clang::printTemplateArgumentList(tmpOS, Args, getPrintingPolicy());
if (tmpOS.str().size() > templateLengthThreshold) {
OS << "<";
OS.write_hex(fnv64Hash(tmpOS));
OS << ">";
} else {
OS << tmpOS.str();
}
}
template <class ATDWriter>
void NamePrinter<ATDWriter>::printDeclName(const NamedDecl &D) {
const DeclContext *Ctx = D.getDeclContext();
SmallVector<const NamedDecl *, 8> Contexts;
Contexts.push_back(&D);
// Don't dump full qualifier for variables declared
// inside a function/method/block
// For structs defined inside functions, dump fully qualified name
if (Ctx->isFunctionOrMethod() && !isa<TagDecl>(&D)) {
Ctx = nullptr;
}
while (Ctx && isa<NamedDecl>(Ctx)) {
bool shouldPrintCtx = true;
// skip inline namespaces when printing qualified name
if (const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(Ctx)) {
if (ND->isInline()) {
shouldPrintCtx = false;
}
}
if (shouldPrintCtx) {
Contexts.push_back(cast<NamedDecl>(Ctx));
}
Ctx = Ctx->getParent();
}
ArrayScope aScope(OF, Contexts.size());
// dump list in reverse
for (const Decl *Ctx : Contexts) {
ConstDeclVisitor<NamePrinter<ATDWriter>>::Visit(Ctx);
}
}
template <class ATDWriter>
void NamePrinter<ATDWriter>::VisitNamedDecl(const NamedDecl *D) {
OF.emitString(D->getNameAsString());
}
template <class ATDWriter>
void NamePrinter<ATDWriter>::VisitNamespaceDecl(const NamespaceDecl *ND) {
if (ND->isAnonymousNamespace()) {
PresumedLoc PLoc = SM.getPresumedLoc(ND->getLocation());
std::string file = "invalid_loc";
if (PLoc.isValid()) {
file = PLoc.getFilename();
}
OF.emitString("anonymous_namespace_" + file);
} else {
// for non-anonymous namespaces, fallback to normal behavior
VisitNamedDecl(ND);
}
}
template <class ATDWriter>
void NamePrinter<ATDWriter>::VisitTagDecl(const TagDecl *D) {
// heavily inspired by clang's TypePrinter::printTag() function
SmallString<64> Buf;
llvm::raw_svector_ostream StrOS(Buf);
if (const IdentifierInfo *II = D->getIdentifier()) {
StrOS << II->getName();
} else if (TypedefNameDecl *Typedef = D->getTypedefNameForAnonDecl()) {
StrOS << Typedef->getIdentifier()->getName();
} else {
if (isa<CXXRecordDecl>(D) && cast<CXXRecordDecl>(D)->isLambda()) {
StrOS << "lambda";
} else {
StrOS << "anonymous_" << D->getKindName();
}
PresumedLoc PLoc = SM.getPresumedLoc(D->getLocation());
if (PLoc.isValid()) {
StrOS << "_" << PLoc.getFilename() << ':' << PLoc.getLine() << ':'
<< PLoc.getColumn();
}
}
if (const ClassTemplateSpecializationDecl *Spec =
dyn_cast<ClassTemplateSpecializationDecl>(D)) {
ArrayRef<TemplateArgument> Args;
const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
Args = TemplateArgs.asArray();
printTemplateArgList(StrOS, Args);
}
OF.emitString(StrOS.str());
}
template <class ATDWriter>
void NamePrinter<ATDWriter>::VisitFunctionDecl(const FunctionDecl *FD) {
std::string template_str = "";
// add instantiated template arguments for readability
if (const TemplateArgumentList *TemplateArgs =
FD->getTemplateSpecializationArgs()) {
SmallString<64> Buf;
llvm::raw_svector_ostream StrOS(Buf);
printTemplateArgList(StrOS, TemplateArgs->asArray());
template_str = StrOS.str();
}
OF.emitString(FD->getNameAsString() + template_str);
}
template <class ATDWriter>
PrintingPolicy NamePrinter<ATDWriter>::getPrintingPolicy() {
// configure what to print
LangOptions LO;
PrintingPolicy Policy(LO);
// print tag types
Policy.IncludeTagDefinition = false;
// print fully qualified names - this is needed by PrintTemplateArgumentList
Policy.SuppressScope = false;
// don't print inline and anonymous namespaces
Policy.SuppressUnwrittenScope = true;
// print locations of anonymous tags
Policy.AnonymousTagLocations = true;
// don't add 'struct' inside a name regardless of language
Policy.SuppressTagKeyword = true;
return Policy;
}
} // end of namespace ASTLib

@ -0,0 +1,13 @@
Front end plugins for Clang
---------------------------
Assuming that the current dir is the root of the git repository and CLANG_PREFIX=/usr/local, you may compile and run tests with
```
export CLANG_PREFIX=/usr/local
make -C libtooling test
```
More information:
- [`ATD_GUIDELINES`](https://github.com/facebook/facebook-clang-plugins/tree/master/libtooling/ATD_GUIDELINES.md) for documentation about ASTExporter.
- http://clang.llvm.org/docs/ClangPlugins.html for general documentation about clang plugins

@ -0,0 +1,180 @@
/*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include <functional>
#include <iostream>
#include <memory>
#include <stdlib.h>
#include <string>
#include <unistd.h>
#include <unordered_map>
#include <llvm/Support/Path.h>
#include "FileUtils.h"
#include "SimplePluginASTAction.h"
namespace ASTPluginLib {
/**
* The actual prefix to prepend to environment variables (but not for the
* command line).
*/
const std::string PluginASTOptionsBase::envPrefix = "CLANG_FRONTEND_PLUGIN__";
PluginASTOptionsBase::argmap_t PluginASTOptionsBase::makeMap(
const std::vector<std::string> &args) {
argmap_t map;
for (auto arg : args) {
size_t pos = arg.find('=');
if (pos != std::string::npos) {
std::string key = arg.substr(0, pos);
std::string value = arg.substr(pos + 1);
map[key] = value;
}
}
return map;
}
bool PluginASTOptionsBase::loadString(const argmap_t &map,
const char *key,
std::string &val) {
auto I = map.find(key);
if (I != map.end()) {
val = I->second;
return true;
}
const char *s = getenv((envPrefix + key).c_str());
if (s != nullptr) {
val = s;
return true;
}
return false;
}
bool PluginASTOptionsBase::loadBool(const argmap_t &map,
const char *key,
bool &val) {
std::string s_val;
if (loadString(map, key, s_val)) {
errno = 0;
val = (bool)strtol(s_val.c_str(), nullptr, 10);
if (errno) {
std::cerr << "[!] Failed to read a bool from " << key << "\n";
}
return true;
}
return false;
}
bool PluginASTOptionsBase::loadInt(const argmap_t &map,
const char *key,
long &val) {
std::string s_val;
if (loadString(map, key, s_val)) {
errno = 0;
val = strtol(s_val.c_str(), nullptr, 10);
if (errno) {
std::cerr << "[!] Failed to read an int from " << key << "\n";
}
return true;
}
return false;
}
bool PluginASTOptionsBase::loadUnsignedInt(const argmap_t &map,
const char *key,
unsigned long &val) {
std::string s_val;
if (loadString(map, key, s_val)) {
errno = 0;
val = strtoul(s_val.c_str(), nullptr, 10);
if (errno) {
std::cerr << "[!] Failed to read an unsigned int from " << key << "\n";
}
return true;
}
return false;
}
void PluginASTOptionsBase::loadValuesFromEnvAndMap(const argmap_t map) {
bool needBasePath = false;
loadBool(map, "ALLOW_SIBLINGS_TO_REPO_ROOT", allowSiblingsToRepoRoot);
loadBool(map, "KEEP_EXTERNAL_PATHS", keepExternalPaths);
loadString(map, "MAKE_RELATIVE_TO", repoRoot);
loadUnsignedInt(map, "MAX_STRING_SIZE", maxStringSize);
// Possibly override the first argument given on the command line.
loadString(map, "OUTPUT_FILE", outputFile);
loadBool(map, "PREPEND_CURRENT_DIR", needBasePath);
loadBool(map, "RESOLVE_SYMLINKS", resolveSymlinks);
loadString(map, "STRIP_ISYSROOT", iSysRoot);
if (needBasePath) {
llvm::SmallString<1024> CurrentDir;
if (llvm::sys::fs::current_path(CurrentDir)) {
llvm::errs() << "Failed to retrieve current working directory\n";
} else {
basePath = CurrentDir.str();
}
}
}
void PluginASTOptionsBase::setObjectFile(const std::string &path) {
objectFile = path;
if (path != "" && outputFile.size() > 0 && outputFile[0] == '%') {
outputFile = path + outputFile.substr(1);
}
}
/**
* Expects an immutable string on the heap as an argument
* (e.g. a path extracted from a node in the AST)
* Do not pass pointers to stack variables to this function.
* (e.g. a .str() call on a StringRef)
*/
const std::string &PluginASTOptionsBase::normalizeSourcePath(
const char *path) const {
auto I = normalizationCache->find(path);
if (I != normalizationCache->end()) {
return I->second;
}
std::string &result = (*normalizationCache)[path];
if (basePath == "") {
result = path;
return result;
}
std::string absPath = FileUtils::makeAbsolutePath(basePath, path);
if (resolveSymlinks) {
// if realPath is a symlink, resolve it
char buf[2048];
int len = readlink(absPath.c_str(), buf, sizeof(buf) - 1);
if (len != -1) {
buf[len] = '\0';
absPath = buf;
}
}
// By convention, relative paths are only activated when repoRoot != "".
if (repoRoot != "") {
result = FileUtils::makeRelativePath(repoRoot,
iSysRoot,
keepExternalPaths,
allowSiblingsToRepoRoot,
absPath);
} else {
result = absPath;
}
return result;
}
const std::string &PluginASTOptionsBase::normalizeSourcePath(
llvm::StringRef path) const {
return normalizeSourcePath(path.data());
}
} // namespace ASTPluginLib

@ -0,0 +1,264 @@
/*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <functional>
#include <memory>
#include <stdlib.h>
#include <string>
#include <unordered_map>
#include <clang/AST/ASTConsumer.h>
#include <clang/Frontend/CompilerInstance.h>
#include <clang/Frontend/FrontendAction.h>
#include <clang/Frontend/FrontendActions.h>
#include <clang/Lex/Preprocessor.h>
#include <clang/Tooling/Tooling.h>
#include "FileUtils.h"
namespace ASTPluginLib {
struct PluginASTOptionsBase {
// source file being parsed
clang::FrontendInputFile inputFile;
// output file for the plugin
std::string outputFile;
// object file produced by the usual frontend (possibly empty)
std::string objectFile;
/* Will contain the current directory if PREPEND_CURRENT_DIR was specified.
* The intention is to make file paths in the AST absolute if needed.
*/
std::string basePath;
/* Configure a second pass on file paths to make them relative to the repo
* root. */
std::string repoRoot;
/* Configure a third pass on (absolute) file paths to blank the system root:
* /path/to/sysroot/usr/lib/foo.h --> /usr/lib/foo.h
*/
std::string iSysRoot;
/* Configure a fourth pass on (absolute) file paths to detect siblings to
* the repo root. If the repo root is /some/path, /some/other_path will be
* rewritten ../other_path
*/
bool allowSiblingsToRepoRoot = false;
/* Whether file paths that could not be normalized by any of the rules above
* should be kept or blanked.
*/
bool keepExternalPaths = false;
/* Resolve symlinks to their real path. */
bool resolveSymlinks = false;
/* do not emit string literals larger than this size */
unsigned long maxStringSize = 65535;
typedef std::unordered_map<std::string, std::string> argmap_t;
static argmap_t makeMap(const std::vector<std::string> &args);
private:
/* cache for normalizeSourcePath */
std::unique_ptr<std::unordered_map<const char *, std::string>>
normalizationCache;
protected:
static const std::string envPrefix;
static bool loadString(const argmap_t &map,
const char *key,
std::string &val);
static bool loadBool(const argmap_t &map, const char *key, bool &val);
static bool loadInt(const argmap_t &map, const char *key, long &val);
static bool loadUnsignedInt(const argmap_t &map,
const char *key,
unsigned long &val);
public:
PluginASTOptionsBase() {
normalizationCache.reset(
new std::unordered_map<const char *, std::string>());
};
void loadValuesFromEnvAndMap(const argmap_t map);
// This should be called after outputFile has been set, so as to finalize
// the output file in case a pattern "%.bla" was given.
void setObjectFile(const std::string &path);
const std::string &normalizeSourcePath(const char *path) const;
const std::string &normalizeSourcePath(llvm::StringRef path) const;
};
struct EmptyPreprocessorHandlerData {};
struct EmptyPreprocessorHandler : public clang::PPCallbacks {
EmptyPreprocessorHandler(
clang::SourceManager &SM,
std::shared_ptr<PluginASTOptionsBase> options,
std::shared_ptr<EmptyPreprocessorHandlerData> sharedData) {}
};
template <class PluginASTOptions = PluginASTOptionsBase,
class PreprocessorHandler = EmptyPreprocessorHandler,
class PreprocessorHandlerData = EmptyPreprocessorHandlerData>
class SimplePluginASTActionBase : public clang::PluginASTAction {
protected:
std::shared_ptr<PluginASTOptions> options;
std::shared_ptr<PreprocessorHandlerData> sharedData;
void ExecuteAction() override {
auto &preprocessor = getCompilerInstance().getPreprocessor();
preprocessor.addPPCallbacks(llvm::make_unique<PreprocessorHandler>(
preprocessor.getSourceManager(), options, sharedData));
clang::PluginASTAction::ExecuteAction();
}
// Called when FrontendPluginRegistry is used.
bool ParseArgs(const clang::CompilerInstance &CI,
const std::vector<std::string> &args_) override {
std::vector<std::string> args = args_;
if (args.size() > 0) {
options->outputFile = args[0];
args.erase(args.begin());
}
options->loadValuesFromEnvAndMap(PluginASTOptions::makeMap(args));
return true;
}
SimplePluginASTActionBase() {
// These data structures will be shared between PreprocessorHandler
// and ASTConsumer (the relative lifetimes of which are unknown).
// During the AST traversal, it is expected that `options` is only read
// and `sharedData` is only written.
options = std::make_shared<PluginASTOptions>();
sharedData = std::make_shared<PreprocessorHandlerData>();
}
// Alternate constructor to pass an optional sequence "KEY=VALUE,.."
// expected to be use with SimpleFrontendActionFactory below.
explicit SimplePluginASTActionBase(const std::vector<std::string> &args)
: SimplePluginASTActionBase() {
options->loadValuesFromEnvAndMap(PluginASTOptions::makeMap(args));
}
bool SetFileOptions(clang::CompilerInstance &CI,
llvm::StringRef inputFilename) {
// When running clang tool on more than one source file, CreateASTConsumer
// will be ran for each of them separately. Hence, Inputs.size() = 1.
clang::FrontendInputFile inputFile = CI.getFrontendOpts().Inputs[0];
switch (inputFile.getKind().getLanguage()) {
case clang::InputKind::Unknown:
case clang::InputKind::Asm:
case clang::InputKind::LLVM_IR:
// We can't do anything with these - they may trigger errors when running
// clang frontend
return false;
default:
// run the consumer for IK_AST and all others
break;
}
options->inputFile = inputFile;
options->setObjectFile(CI.getFrontendOpts().OutputFile);
// success
return true;
}
};
template <class SimpleASTAction>
class SimpleFrontendActionFactory
: public clang::tooling::FrontendActionFactory {
std::vector<std::string> args_;
public:
explicit SimpleFrontendActionFactory(std::vector<std::string> args)
: args_(args) {}
clang::FrontendAction *create() override {
return new SimpleASTAction(args_);
}
};
template <class ASTConsumer,
bool Binary = 0,
bool RemoveFileOnSignal = 1,
bool UseTemporary = 1,
bool CreateMissingDirectories = 0>
class SimplePluginASTAction
: public SimplePluginASTActionBase<
typename ASTConsumer::ASTConsumerOptions,
typename ASTConsumer::PreprocessorHandler,
typename ASTConsumer::PreprocessorHandlerData> {
using Parent =
SimplePluginASTActionBase<typename ASTConsumer::ASTConsumerOptions,
typename ASTConsumer::PreprocessorHandler,
typename ASTConsumer::PreprocessorHandlerData>;
public:
SimplePluginASTAction() {}
explicit SimplePluginASTAction(const std::vector<std::string> &args)
: Parent(args) {}
protected:
std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(
clang::CompilerInstance &CI, llvm::StringRef inputFilename) {
if (!Parent::SetFileOptions(CI, inputFilename)) {
return nullptr;
}
std::unique_ptr<llvm::raw_ostream> OS =
CI.createOutputFile(Parent::options->outputFile,
Binary,
RemoveFileOnSignal,
"",
"",
UseTemporary,
CreateMissingDirectories);
if (!OS) {
return nullptr;
}
return std::unique_ptr<clang::ASTConsumer>(new ASTConsumer(
CI, Parent::options, Parent::sharedData, std::move(OS)));
}
};
template <class ASTConsumer>
class NoOpenSimplePluginASTAction
: public SimplePluginASTActionBase<
typename ASTConsumer::ASTConsumerOptions,
typename ASTConsumer::PreprocessorHandler,
typename ASTConsumer::PreprocessorHandlerData> {
using Parent =
SimplePluginASTActionBase<typename ASTConsumer::ASTConsumerOptions,
typename ASTConsumer::PreprocessorHandler,
typename ASTConsumer::PreprocessorHandlerData>;
public:
NoOpenSimplePluginASTAction() {}
explicit NoOpenSimplePluginASTAction(const std::vector<std::string> &args)
: Parent(args) {}
protected:
std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(
clang::CompilerInstance &CI, llvm::StringRef inputFilename) {
if (!Parent::SetFileOptions(CI, inputFilename)) {
return nullptr;
}
std::unique_ptr<std::string> outputFile = std::unique_ptr<std::string>(
new std::string(Parent::options->outputFile));
return std::unique_ptr<clang::ASTConsumer>(new ASTConsumer(
CI, Parent::options, Parent::sharedData, std::move(outputFile)));
}
};
} // namespace ASTPluginLib

@ -0,0 +1,78 @@
/*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* Clang tool to export an AST of clang into Json, Yojson, and Biniou
* while conforming to the inlined ATD specifications.
*/
#include "ASTExporter.h"
#include <clang/Tooling/CommonOptionsParser.h>
#include <clang/Tooling/Tooling.h>
//===----------------------------------------------------------------------===//
// ASTExporter Tool
//===----------------------------------------------------------------------===//
static llvm::cl::OptionCategory astExporterCategory("ast_exporter_bin");
enum Mode { json, yojson, biniou };
static llvm::cl::opt<Mode> astExporterMode(
"ast-exporter-mode",
llvm::cl::desc("Mode of operation"),
llvm::cl::values(clEnumVal(json, "json output"),
clEnumVal(yojson, "yojson output"),
clEnumVal(biniou, "biniou output")),
llvm::cl::cat(astExporterCategory));
static llvm::cl::opt<std::string> astExporterOutput(
"ast-exporter-output",
llvm::cl::desc("output file"),
llvm::cl::cat(astExporterCategory));
// TODO: Unpack the other ASTExporterOptions into native command line options.
static llvm::cl::list<std::string> astExporterOptions(
"ast-exporter-option",
llvm::cl::desc("One or several comma-separated pairs [KEY]=[VALUE]. "
"This will override the corresponding environment variables "
"CLANG_FRONTEND_PLUGIN__[KEY]."),
llvm::cl::CommaSeparated,
llvm::cl::cat(astExporterCategory));
static llvm::cl::extrahelp commonHelp(
clang::tooling::CommonOptionsParser::HelpMessage);
int main(int argc, const char **argv) {
clang::tooling::CommonOptionsParser optionsParser(
argc, argv, astExporterCategory);
clang::tooling::ClangTool tool(optionsParser.getCompilations(),
optionsParser.getSourcePathList());
if (!astExporterOutput.empty()) {
astExporterOptions.push_back("OUTPUT_FILE=" + astExporterOutput);
}
std::unique_ptr<clang::tooling::ToolAction> factory = nullptr;
switch (astExporterMode) {
case json:
factory.reset(new ASTPluginLib::SimpleFrontendActionFactory<
ASTLib::JsonExporterASTAction>(astExporterOptions));
break;
case yojson:
factory.reset(new ASTPluginLib::SimpleFrontendActionFactory<
ASTLib::YojsonExporterASTAction>(astExporterOptions));
break;
case biniou:
factory.reset(new ASTPluginLib::SimpleFrontendActionFactory<
ASTLib::BiniouExporterASTAction>(astExporterOptions));
break;
}
return tool.run(factory.get());
}

@ -0,0 +1,690 @@
/*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <assert.h>
#include <functional>
#include <iostream>
#include <memory>
#include <vector>
namespace ATDWriter {
struct ATDWriterOptions {
bool useYojson;
bool prettifyJson;
};
// Symbols to be stacked
enum Symbol { SARRAY, STUPLE, SOBJECT, SVARIANT, STAG };
// whether the container has a {maximum,exact} size
enum ContainerSizeKind {
CSKNONE, // no size info
CSKEXACT, // the container expects exactly this number of items
CSKMAX // the container expects at most this number of items
};
// Main class for writing ATD-like data
// - In NDEBUG mode this class is only a wrapper around an ATDEmitter
// - In DEBUG mode it acts as a validator: asserts will fire if the events do
// not correspond to a well-formed ATD/JSON value
template <class ATDEmitter>
class GenWriter {
protected:
ATDEmitter emitter_;
private:
#ifdef DEBUG
// State of the automaton
std::vector<enum Symbol> stack_;
// Objects want tagged values
static bool needsTag(enum Symbol s) { return s == SOBJECT; }
// How many elements are expected in the current container
std::vector<int> containerSize_;
std::vector<enum ContainerSizeKind> containerSizeKind_;
#endif
void enterValue() {
#ifdef DEBUG
if (stack_.empty()) {
return;
}
assert(!needsTag(stack_.back()));
#endif
}
void leaveValue() {
#ifdef DEBUG
switch (containerSizeKind_.back()) {
case CSKEXACT:
case CSKMAX:
containerSize_.back() -= 1;
break;
case CSKNONE:
break;
}
if (stack_.empty()) {
return;
}
if (stack_.back() == STAG) {
stack_.pop_back();
assert(needsTag(stack_.back()));
}
#endif
}
void emitValue() {
enterValue();
leaveValue();
}
void enterContainer(enum Symbol s,
enum ContainerSizeKind csk = CSKNONE,
int numElems = 0) {
#ifdef DEBUG
enterValue();
stack_.push_back(s);
containerSizeKind_.push_back(csk);
switch (csk) {
case CSKEXACT:
case CSKMAX:
containerSize_.push_back(numElems);
break;
case CSKNONE:
break;
}
#endif
}
void leaveContainer(enum Symbol s) {
#ifdef DEBUG
assert(stack_.back() == s);
stack_.pop_back();
switch (containerSizeKind_.back()) {
case CSKEXACT:
assert(containerSize_.back() == 0);
case CSKMAX:
assert(!containerSize_.empty());
assert(containerSize_.back() >= 0);
containerSize_.pop_back();
break;
case CSKNONE:
break;
}
containerSizeKind_.pop_back();
leaveValue();
#endif
}
public:
GenWriter(ATDEmitter emitter) : emitter_(emitter) {
#ifdef DEBUG
containerSizeKind_.push_back(CSKNONE);
#endif
}
~GenWriter() {
#ifdef DEBUG
assert(stack_.empty());
assert(containerSizeKind_.size() == 1);
assert(containerSizeKind_.back() == CSKNONE);
#endif
emitter_.emitEOF();
}
void emitNull() {
emitValue();
emitter_.emitNull();
}
void emitBoolean(bool val) {
emitValue();
emitter_.emitBoolean(val);
}
void emitInteger(int64_t val) {
emitValue();
emitter_.emitInteger(val);
}
void emitFloat(float val) {
emitValue();
emitter_.emitFloat(val);
}
void emitString(const std::string &val) {
emitValue();
emitter_.emitString(val);
}
void emitTag(const std::string &val) {
#ifdef DEBUG
assert(needsTag(stack_.back()));
stack_.push_back(STAG);
#endif
emitter_.emitTag(val);
}
void enterArray(int numElems) {
enterContainer(SARRAY, CSKEXACT, numElems);
emitter_.enterArray(numElems);
}
void enterArray() {
enterContainer(SARRAY);
emitter_.enterArray();
}
void leaveArray() {
leaveContainer(SARRAY);
emitter_.leaveArray();
}
void enterObject(int numElems) {
enterContainer(SOBJECT, CSKMAX, numElems);
emitter_.enterObject(numElems);
}
void enterObject() {
enterContainer(SOBJECT);
emitter_.enterObject();
}
void leaveObject() {
leaveContainer(SOBJECT);
emitter_.leaveObject();
}
void enterTuple(int numElems) {
enterContainer(STUPLE, CSKEXACT, numElems);
emitter_.enterTuple(numElems);
}
void enterTuple() {
enterContainer(STUPLE);
emitter_.enterTuple();
}
void leaveTuple() {
leaveContainer(STUPLE);
emitter_.leaveTuple();
}
void enterVariant(const std::string &tag, bool hasArg = true) {
// variants have at most one value, so we can safely use hasArg
// as the number of arguments
enterContainer(SVARIANT, CSKEXACT, hasArg);
emitter_.enterVariant();
emitter_.emitVariantTag(tag, hasArg);
}
void leaveVariant() {
leaveContainer(SVARIANT);
emitter_.leaveVariant();
}
void emitSimpleVariant(const std::string &tag) {
if (emitter_.shouldSimpleVariantsBeEmittedAsStrings) {
emitString(tag);
} else {
enterVariant(tag, false);
leaveVariant();
}
}
// convenient methods
void emitFlag(const std::string &tag, bool val) {
if (val) {
emitTag(tag);
emitBoolean(true);
}
}
// convenient classes for automatically closing containers using C++ scoping
class ArrayScope {
GenWriter &f_;
public:
ArrayScope(GenWriter &f, int size) : f_(f) { f_.enterArray(size); }
ArrayScope(GenWriter &f) : f_(f) { f_.enterArray(); }
~ArrayScope() { f_.leaveArray(); }
};
class ObjectScope {
GenWriter &f_;
public:
ObjectScope(GenWriter &f, int size) : f_(f) { f_.enterObject(size); }
ObjectScope(GenWriter &f) : f_(f) { f_.enterObject(); }
~ObjectScope() { f_.leaveObject(); }
};
class TupleScope {
GenWriter &f_;
public:
TupleScope(GenWriter &f, int size) : f_(f) { f_.enterTuple(size); }
TupleScope(GenWriter &f) : f_(f) { f_.enterTuple(); }
~TupleScope() { f_.leaveTuple(); }
};
class VariantScope {
GenWriter &f_;
public:
VariantScope(GenWriter &f, const std::string &tag) : f_(f) {
f_.enterVariant(tag, true);
}
~VariantScope() { f_.leaveVariant(); }
};
};
// Configure GenWriter for Yojson / Json textual outputs
template <class OStream = std::ostream>
class JsonEmitter {
const char *QUOTE = "\"";
const char *COMMA = ",";
const char *TAB = " ";
const char *NEWLINE = "\n";
const char *COLON = ":";
const char *COLONWITHSPACES = " : ";
const char *COMMAWITHSPACES = " , ";
const char *NULLSTR = "null";
const char *FALSESTR = "false";
const char *TRUESTR = "true";
const char LBRACKET = '[';
const char RBRACKET = ']';
const char LBRACE = '{';
const char RBRACE = '}';
const char LPAREN = '(';
const char RPAREN = ')';
const char LANGLE = '<';
const char RANGLE = '>';
private:
OStream &os_;
const ATDWriterOptions options_;
unsigned indentLevel_;
bool nextElementNeedsNewLine_;
bool previousElementNeedsComma_;
bool previousElementIsVariantTag_;
public:
bool shouldSimpleVariantsBeEmittedAsStrings;
JsonEmitter(OStream &os, const ATDWriterOptions opts)
: os_(os),
options_(opts),
indentLevel_(0),
nextElementNeedsNewLine_(false),
previousElementNeedsComma_(false),
previousElementIsVariantTag_(false),
shouldSimpleVariantsBeEmittedAsStrings(!opts.useYojson) {}
void tab() {
if (previousElementIsVariantTag_) {
if (options_.prettifyJson) {
os_ << (options_.useYojson ? COLONWITHSPACES : COMMAWITHSPACES);
} else {
os_ << (options_.useYojson ? COLON : COMMA);
}
} else if (previousElementNeedsComma_) {
os_ << COMMA;
}
if (nextElementNeedsNewLine_ && options_.prettifyJson) {
os_ << NEWLINE;
for (size_t i = 0; i < indentLevel_; i++) {
os_ << TAB;
}
}
}
private:
// TODO: unicode and other control chars
void write_escaped(const std::string &val) {
for (std::string::const_iterator i = val.begin(), e = val.end(); i != e;
i++) {
char x = *i;
switch (x) {
case '\\':
os_ << "\\\\";
break;
case '"':
os_ << "\\\"";
break;
case '\n':
os_ << "\\n";
break;
case '\t':
os_ << "\\t";
break;
case '\b':
os_ << "\\b";
break;
case '\f':
os_ << "\\f";
break;
case '\r':
os_ << "\\r";
break;
default:
os_ << x;
break;
}
}
}
void enterContainer(char c) {
tab();
os_ << c;
indentLevel_++;
previousElementNeedsComma_ = false;
nextElementNeedsNewLine_ = true;
previousElementIsVariantTag_ = false;
}
void leaveContainer(char c) {
indentLevel_--;
// suppress the last comma or variant separator
previousElementNeedsComma_ = false;
previousElementIsVariantTag_ = false;
tab();
os_ << c;
previousElementNeedsComma_ = true;
nextElementNeedsNewLine_ = true;
}
public:
void emitEOF() { os_ << NEWLINE; }
void emitNull() {
tab();
os_ << NULLSTR;
previousElementNeedsComma_ = true;
nextElementNeedsNewLine_ = true;
previousElementIsVariantTag_ = false;
}
void emitBoolean(bool val) {
tab();
os_ << (val ? TRUESTR : FALSESTR);
previousElementNeedsComma_ = true;
nextElementNeedsNewLine_ = true;
previousElementIsVariantTag_ = false;
}
void emitInteger(int64_t val) {
tab();
os_ << val;
previousElementNeedsComma_ = true;
nextElementNeedsNewLine_ = true;
previousElementIsVariantTag_ = false;
}
void emitString(const std::string &val) {
tab();
os_ << QUOTE;
write_escaped(val);
os_ << QUOTE;
previousElementNeedsComma_ = true;
nextElementNeedsNewLine_ = true;
previousElementIsVariantTag_ = false;
}
void emitTag(const std::string &val) {
tab();
os_ << QUOTE;
write_escaped(val);
os_ << QUOTE;
if (options_.prettifyJson) {
os_ << COLONWITHSPACES;
} else {
os_ << COLON;
}
previousElementNeedsComma_ = false;
nextElementNeedsNewLine_ = false;
previousElementIsVariantTag_ = false;
}
void emitVariantTag(const std::string &val, bool hasArgs) {
tab();
os_ << QUOTE;
write_escaped(val);
os_ << QUOTE;
previousElementNeedsComma_ = false;
nextElementNeedsNewLine_ = false;
previousElementIsVariantTag_ = true;
}
void enterArray() { enterContainer(LBRACKET); }
void enterArray(int size) { enterArray(); }
void leaveArray() { leaveContainer(RBRACKET); }
void enterObject() { enterContainer(LBRACE); }
void enterObject(int size) { enterObject(); }
void leaveObject() { leaveContainer(RBRACE); }
void enterTuple() { enterContainer(options_.useYojson ? LPAREN : LBRACKET); }
void enterTuple(int size) { enterTuple(); }
void leaveTuple() { leaveContainer(options_.useYojson ? RPAREN : RBRACKET); }
void enterVariant() {
enterContainer(options_.useYojson ? LANGLE : LBRACKET);
// cancel indent
indentLevel_--;
nextElementNeedsNewLine_ = false;
}
void leaveVariant() {
nextElementNeedsNewLine_ = false;
leaveContainer(options_.useYojson ? RANGLE : RBRACKET);
indentLevel_++;
}
};
const uint8_t bool_tag = 0;
const uint8_t int8_tag = 1;
const uint8_t int16_tag = 2;
const uint8_t int32_tag = 3;
const uint8_t int64_tag = 4;
const uint8_t float64_tag = 12;
const uint8_t uvint_tag = 16;
const uint8_t svint_tag = 17;
const uint8_t string_tag = 18;
const uint8_t ARRAY_tag = 19;
const uint8_t TUPLE_tag = 20;
const uint8_t RECORD_tag = 21;
const uint8_t NUM_VARIANT_tag = 22;
const uint8_t VARIANT_tag = 23;
const uint8_t unit_tag = 24;
const uint8_t TABLE_tag = 25;
const uint8_t SHARED_tag = 26;
const int SIZE_NOT_NEEDED = -1;
// Configure GenWriter for Biniou binary output
template <class OStream = std::ostream>
class BiniouEmitter {
private:
OStream &os_;
// Opened container, writing in progress.
struct ATDContainer {
uint8_t tag;
int size;
int count;
ATDContainer(uint8_t tag, int size) : tag(tag), size(size), count(0) {}
};
// The full stack of opened containers
std::vector<ATDContainer> atdContainers;
public:
const bool shouldSimpleVariantsBeEmittedAsStrings = false;
BiniouEmitter(OStream &os) : os_(os) {}
private:
bool isValueTagNeeded() {
if (!atdContainers.empty()) {
const ATDContainer &obj = atdContainers.back();
return obj.tag != ARRAY_tag || obj.count == 0;
}
return true;
}
void markWrite() {
if (!atdContainers.empty()) {
atdContainers.back().count++;
}
}
void enterContainer(uint8_t tag, int size) {
bool needTag = isValueTagNeeded();
atdContainers.emplace_back(tag, size);
writeValueTag(os_, needTag, tag);
if (size != SIZE_NOT_NEEDED) {
writeUvint(os_, size);
}
}
void leaveContainer() {
atdContainers.pop_back();
markWrite();
}
// string hash algorithm from the biniou spec
static uint32_t biniou_hash(const std::string &str) {
uint32_t hash = 0;
for (const char &c : str) {
hash = 223 * hash + c;
}
hash %= 1 << 31;
return hash;
}
static void write8(OStream &os, uint8_t c) { os.write((const char *)&c, 1); }
static void write32(OStream &os, int32_t x) {
write8(os, x >> 24);
write8(os, x >> 16);
write8(os, x >> 8);
write8(os, x);
}
static void writeUvint(OStream &os, uint64_t x) {
while (x > 127) {
write8(os, x | 128);
x >>= 7;
}
write8(os, (uint8_t)x);
}
static void writeSvint(OStream &os, int64_t x) {
if (x >= 0) {
uint64_t t = x;
t = t * 2;
writeUvint(os, t);
} else {
uint64_t t = -x;
t = t * 2 - 1;
writeUvint(os, t);
}
}
static void writeValueTag(OStream &os, bool needTag, uint8_t tag) {
if (needTag) {
write8(os, tag);
}
}
void emitDummyRecordField() {
emitTag("!!DUMMY!!");
markWrite();
// unit is the smallest value (2 bytes)
write8(os_, unit_tag);
write8(os_, 0);
}
public:
void emitEOF() {}
void emitBoolean(bool val) {
bool needTag = isValueTagNeeded();
markWrite();
writeValueTag(os_, needTag, bool_tag);
write8(os_, val);
}
void emitInteger(int64_t val) {
bool needTag = isValueTagNeeded();
markWrite();
writeValueTag(os_, needTag, svint_tag);
writeSvint(os_, val);
}
void emitString(const std::string &val) {
bool needTag = isValueTagNeeded();
markWrite();
writeValueTag(os_, needTag, string_tag);
writeUvint(os_, val.length());
for (const char &c : val) {
write8(os_, c);
}
}
void emitTag(const std::string &val) {
int32_t hash = biniou_hash(val);
// set first bit of hash
hash |= 1 << 31;
markWrite();
write32(os_, hash);
}
void emitVariantTag(const std::string &val, bool hasArg) {
int32_t hash = biniou_hash(val);
// set first bit of hash if the variant has an argument
if (hasArg) {
hash |= 1 << 31;
}
markWrite();
write32(os_, hash);
}
void enterArray(int size) { enterContainer(ARRAY_tag, size); }
// unsupported:
// void enterArray() { enterContainer(ARRAY_tag); }
void leaveArray() { leaveContainer(); }
void enterObject(int size) { enterContainer(RECORD_tag, size); }
// unsupported:
// void enterObject() { enterContainer(RECORD_tag); }
void leaveObject() {
const ATDContainer &obj = atdContainers.back();
// Container's size was already written -> must fill in for missing
// records.
for (int i = obj.count / 2; i < obj.size; i++) {
emitDummyRecordField();
}
leaveContainer();
}
void enterTuple(int size) { enterContainer(TUPLE_tag, size); }
// unsupported:
// void enterTuple() { enterContainer(TUPLE_tag); }
void leaveTuple() { leaveContainer(); }
void enterVariant() { enterContainer(VARIANT_tag, SIZE_NOT_NEEDED); }
void leaveVariant() { leaveContainer(); }
};
// The full class for JSON and YOJSON writing
template <class OStream = std::ostream>
class JsonWriter : public GenWriter<JsonEmitter<OStream>> {
typedef JsonEmitter<OStream> Emitter;
public:
JsonWriter(OStream &os, const ATDWriterOptions opts)
: GenWriter<Emitter>(Emitter(os, opts)) {}
};
// The full class for biniou writing
template <class OStream>
class BiniouWriter : public GenWriter<BiniouEmitter<OStream>> {
typedef BiniouEmitter<OStream> Emitter;
public:
BiniouWriter(OStream &os) : GenWriter<Emitter>(Emitter(os)) {}
BiniouWriter(OStream &os, const ATDWriterOptions opts)
: GenWriter<Emitter>(Emitter(os)) {}
};
} // namespace ATDWriter

@ -0,0 +1,35 @@
# Copyright (c) 2014-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
.PHONY: clean all test
LEVEL=../..
include $(LEVEL)/Makefile.common
all: build/jsontest build/binioutest
build/jsontest: tests/jsontest.cpp ATDWriter.h
@mkdir -p build
$(CXX) $(CFLAGS) $< -o $@
build/binioutest: tests/binioutest.cpp ATDWriter.h
@mkdir -p build
$(CXX) $(CFLAGS) $< -o $@
test: build/jsontest build/binioutest extract_atd_from_cpp.py normalize_names_in_atd.py
@$(RUNTEST) tests/jsontest build/jsontest
@! hash bdump 2>/dev/null || $(RUNTEST) tests/binioutest tests/binioutest.sh
@$(RUNTEST) tests/extract_test.cpp extract_atd_from_cpp.py tests/extract_test.cpp
@$(RUNTEST) tests/normalize_test.atd normalize_names_in_atd.py tests/normalize_test.atd
@if [ ! $$KEEP_TEST_OUTPUTS ]; then rm -f tests/*.out; fi
record-test-outputs:
@rm -f tests/*.out
@$(MAKE) DEBUG=1 KEEP_TEST_OUTPUTS=1 test || true
@for F in tests/*.out; do cp $$F $${F%.out}.exp; done
@rm -f tests/*.out
clean:
@rm -rf build/* tests/*.o tests/*.out

@ -0,0 +1,35 @@
#!/usr/bin/env python3
# Copyright (c) 2014-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
import sys
import argparse
import re
"""
Extract the ATD specifications inlined in a C/C++ file
"""
atd_comment = re.compile(r'^ *//@atd ?(.*)')
def start(file):
for line in file:
m = atd_comment.match(line)
if m:
print(m.group(1))
def main():
arg_parser = argparse.ArgumentParser(description='Extract the ATD specifications inlined in a C/C++ file')
arg_parser.add_argument(metavar="FILE", nargs='?', dest="input_file", help="Input log file (default: stdin)")
args = arg_parser.parse_args()
if args.input_file:
file = open(args.input_file, "r")
else:
file = sys.stdin
start(file)
if __name__ == '__main__':
main()

@ -0,0 +1,65 @@
#!/usr/bin/env python3
# Copyright (c) 2014-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
import sys
import re
import argparse
"""
This script normalizes the names between "@" across the file + removes empty lines.
"""
bigcap = re.compile("([A-Z]*)([A-Z])")
def normalize_name(name, first_letter_in_bigcap = False):
"""
Convert a name in java-like convention to the small-caps + underscores convention.
Examples of renaming:
ThisName -> this_name
CXXDecl -> cxx_decl
"""
name = name.strip()
if name == "":
return
def f_sub(m):
res = "";
if m.start() != 0:
res += "_"
if m.group(1) != "":
res += m.group(1).lower()
res += "_"
res += m.group(2).lower()
return res
name = bigcap.sub(f_sub, name)
if first_letter_in_bigcap:
name = name[0].upper() + name[1:]
return name
at_word = re.compile("@(.*?)@")
def start(file):
for line in file:
if not line.strip():
continue
line = at_word.sub(lambda m: normalize_name(m.group(1)), line)
sys.stdout.write(line)
def main():
arg_parser = argparse.ArgumentParser(description='Normalize the strings "@AxxByy@" to "axx_byy" across the ATD file and remove empty lines.')
arg_parser.add_argument(metavar="FILE", nargs='?', dest="input_file", help="Input log file (default: stdin)")
args = arg_parser.parse_args()
if args.input_file:
file = open(args.input_file, "r")
else:
file = sys.stdin
start(file)
if __name__ == '__main__':
main()

@ -0,0 +1,145 @@
/*
* Copyright (c) 2015-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "../ATDWriter.h"
typedef ATDWriter::BiniouWriter<std::ostream> BiniouWriter;
typedef BiniouWriter::ObjectScope ObjectScope;
typedef BiniouWriter::ArrayScope ArrayScope;
typedef BiniouWriter::VariantScope VariantScope;
typedef BiniouWriter::TupleScope TupleScope;
int main(int argc, char **argv) {
{
BiniouWriter OF(std::cout);
OF.emitInteger(-100000);
}
{
BiniouWriter OF(std::cout);
int64_t min_ocaml = -4611686018427387904;
OF.emitInteger(min_ocaml);
}
{
BiniouWriter OF(std::cout);
int64_t max_ocaml = 4611686018427387903;
OF.emitInteger(max_ocaml);
}
{
BiniouWriter OF(std::cout);
OF.emitString("Hello");
}
{
BiniouWriter OF(std::cout);
OF.emitBoolean(true);
}
{
BiniouWriter OF(std::cout);
ArrayScope Scope(OF, 0);
}
{
BiniouWriter OF(std::cout);
ArrayScope Scope(OF, 3);
OF.emitString("Hello, how are you?");
OF.emitString("I'm well, thank you; and you, how are you?");
OF.emitString("I'm fine, thank you.");
}
{
BiniouWriter OF(std::cout);
ArrayScope Scope(OF, 3);
{
ArrayScope Scope(OF, 1);
{
ArrayScope Scope(OF, 1);
OF.emitInteger(1);
}
}
{
ArrayScope Scope(OF, 2);
{ ArrayScope Scope(OF, 0); }
{
ArrayScope Scope(OF, 2);
OF.emitInteger(2);
OF.emitInteger(3);
}
}
{ ArrayScope Scope(OF, 0); }
}
{
BiniouWriter OF(std::cout);
ObjectScope Scope(OF, 12); // 12 is larger than the actual size on purpose
OF.emitTag("string");
OF.emitString("Hello");
OF.emitTag("boolean");
OF.emitBoolean(true);
OF.emitTag("integer");
OF.emitInteger(100000);
}
{
BiniouWriter OF(std::cout);
ObjectScope Scope(OF, 2);
OF.emitTag("integer");
OF.emitInteger(100000);
OF.emitTag("array");
{
ArrayScope Scope(OF, 2);
OF.emitInteger(1);
OF.emitInteger(2);
}
}
{
BiniouWriter OF(std::cout);
ObjectScope Scope(OF, 2);
OF.emitTag("string");
OF.emitString("multiply");
OF.emitTag("array");
{
ArrayScope Scope(OF, 2);
{
ObjectScope Scope(OF, 1);
OF.emitTag("integer");
OF.emitInteger(32);
}
{
ObjectScope Scope(OF, 2);
OF.emitTag("integer");
OF.emitInteger(52);
}
}
}
{
BiniouWriter OF(std::cout);
TupleScope Scope(OF, 2);
OF.emitSimpleVariant("zero");
{
VariantScope Scope(OF, "succ");
{
VariantScope Scope(OF, "pred");
OF.emitSimpleVariant("zero");
}
}
}
{
BiniouWriter OF(std::cout);
TupleScope Scope(OF, 2);
OF.emitSimpleVariant("zero");
{
VariantScope Scope(OF, "succ");
{
VariantScope Scope(OF, "pred");
{
VariantScope Scope(OF, "eval");
{
TupleScope Scope(OF, 2);
OF.emitString("f");
OF.emitString("\"3\t4\n\"");
}
}
}
}
}
return 0;
}

@ -0,0 +1,32 @@
-100000
-4611686018427387904
4611686018427387903
"Hello"
true
[]
[
"Hello, how are you?", "I'm well, thank you; and you, how are you?",
"I'm fine, thank you."
]
[ [ [ 1 ] ], [ [], [ 2, 3 ] ], [] ]
{
#113028d1: "Hello",
#fdfeeaa8: true,
#171bbdbe: 100000,
#21ac3408: unit,
#21ac3408: unit,
#21ac3408: unit,
#21ac3408: unit,
#21ac3408: unit,
#21ac3408: unit,
#21ac3408: unit,
#21ac3408: unit,
#21ac3408: unit
}
{ #171bbdbe: 100000, #258f6d99: [ 1, 2 ] }
{
#113028d1: "multiply",
#258f6d99: [ { #171bbdbe: 32 }, { #171bbdbe: 52, #21ac3408: unit } ]
}
(<#d0f10f28>, <#cc5ca7c2: <#ca5ebee1: <#d0f10f28>>>)
(<#d0f10f28>, <#cc5ca7c2: <#ca5ebee1: <#c31c6b9c: ("f", "\"3\t4\n\"")>>>)

@ -0,0 +1,7 @@
#!/bin/sh
# Copyright (c) 2015-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
./build/binioutest | bdump

@ -0,0 +1,24 @@
/*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
//@atd type x = {
//@atd foo : int
//@atd }
//@atd
// main
int main() {}
//@atd type x = {
//@atd}
// bla
//@atd foo
//@atd bar
//@atd still there
//@atd some long line cut with \
//@atd bla

@ -0,0 +1,11 @@
type x = {
foo : int
}
type x = {
}
foo
bar
still there
some long line cut with \
bla

@ -0,0 +1,103 @@
/*
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "../ATDWriter.h"
typedef ATDWriter::JsonWriter<std::ostream> JsonWriter;
typedef JsonWriter::ObjectScope ObjectScope;
typedef JsonWriter::ArrayScope ArrayScope;
typedef JsonWriter::VariantScope VariantScope;
typedef JsonWriter::TupleScope TupleScope;
int main(int argc, char **argv) {
const struct ATDWriter::ATDWriterOptions jsonWriterOptions = {
.useYojson = false,
.prettifyJson = true,
};
const struct ATDWriter::ATDWriterOptions yojsonWriterOptions = {
.useYojson = true,
.prettifyJson = true,
};
{
JsonWriter OF(std::cout, yojsonWriterOptions);
OF.emitInteger(100000);
}
{
JsonWriter OF(std::cout, yojsonWriterOptions);
OF.emitInteger(-100000);
}
{
JsonWriter OF(std::cout, yojsonWriterOptions);
OF.emitString("Hello");
}
{
JsonWriter OF(std::cout, yojsonWriterOptions);
OF.emitBoolean(true);
}
{
JsonWriter OF(std::cout, yojsonWriterOptions);
ArrayScope Scope(OF, 3);
OF.emitString("Hello");
OF.emitBoolean(true);
OF.emitInteger(100000);
}
{
JsonWriter OF(std::cout, yojsonWriterOptions);
ObjectScope Scope(OF, 4); // 4 is larger than the actual size on purpose
OF.emitTag("string");
OF.emitString("Hello");
OF.emitTag("boolean");
OF.emitBoolean(true);
OF.emitTag("integer");
OF.emitInteger(100000);
}
{
JsonWriter OF(std::cout, yojsonWriterOptions);
ObjectScope Scope(OF, 2);
OF.emitTag("integer");
OF.emitInteger(100000);
OF.emitTag("array");
{
ArrayScope Scope(OF, 2);
OF.emitInteger(1);
OF.emitInteger(2);
}
}
{
JsonWriter OF(std::cout, jsonWriterOptions);
TupleScope Scope(OF, 2);
OF.emitSimpleVariant("zero");
{
VariantScope Scope(OF, "succ");
{
VariantScope Scope(OF, "pred");
OF.emitSimpleVariant("zero");
}
}
}
{
JsonWriter OF(std::cout, yojsonWriterOptions);
TupleScope Scope(OF, 2);
OF.emitSimpleVariant("zero");
{
VariantScope Scope(OF, "succ");
{
VariantScope Scope(OF, "pred");
{
VariantScope Scope(OF, "eval");
{
TupleScope Scope(OF, 2);
OF.emitString("f");
OF.emitString("\"3\t4\n\"");
}
}
}
}
}
return 0;
}

@ -0,0 +1,32 @@
100000
-100000
"Hello"
true
[
"Hello",
true,
100000
]
{
"string" : "Hello",
"boolean" : true,
"integer" : 100000
}
{
"integer" : 100000,
"array" : [
1,
2
]
}
[
"zero",
["succ" , ["pred" , "zero"]]
]
(
<"zero">,
<"succ" : <"pred" : <"eval" : (
"f",
"\"3\t4\n\""
)>>>
)

@ -0,0 +1,5 @@
type @ObjCExpression@ = {}
type x@@yz = {
@CXXExpression@ : string
}

@ -0,0 +1,4 @@
type obj_c_expression = {}
type xyz = {
cxx_expression : string
}

@ -0,0 +1,399 @@
tests/available_expression.m:8:12: warning: class 'NSObject' defined without specifying a base class [-Wobjc-root-class]
@interface NSObject
^
tests/available_expression.m:8:20: note: add a super class to fix this problem
@interface NSObject
^
: NSObject
1 warning generated.
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "SEL", #2cdb06fb: [ "SEL" ] },
5,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "id", #2cdb06fb: [ "id" ] },
7,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 8, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "Class", #2cdb06fb: [ "Class" ] },
0,
{ })>,
<#18d25297:
({
#d121c0bd: 9,
#f9005968: 1,
#21793419: ({ }, { }),
#eb8a1f5a: true
},
{ #c8ff724b: "Protocol", #2cdb06fb: [ "Protocol" ] },
[],
{ },
{ })>,
<#0f3f4d35:
({ #d121c0bd: 10, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 11, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 12, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#18d25297:
({
#d121c0bd: 13,
#f9005968: 1,
#21793419:
({
#c3bbce7c: "tests/available_expression.m",
#c7b317f4: 8,
#c68b4ed6: 1
},
{ #c7b317f4: 9, #c68b4ed6: 2 })
},
{ #c8ff724b: "NSObject", #2cdb06fb: [ "NSObject" ] },
[],
{ },
{
#d32dd232: {
#c709e154: <#c37c57de>,
#ec05e4a8: 14,
#c8ff724b: { #c8ff724b: "NSObject", #2cdb06fb: [ "NSObject" ] }
}
})>,
<#0e281b68:
({
#d121c0bd: 14,
#f9005968: 1,
#21793419:
({ #c7b317f4: 10, #c68b4ed6: 1 },
{ #c7b317f4: 11, #c68b4ed6: 1 })
},
{ #c8ff724b: "NSObject", #2cdb06fb: [ "NSObject" ] },
[],
{ },
{
#2ec29bb2: {
#c709e154: <#3cf18b8d>,
#ec05e4a8: 13,
#c8ff724b: { #c8ff724b: "NSObject", #2cdb06fb: [ "NSObject" ] }
}
})>,
<#18d25297:
({
#d121c0bd: 15,
#f9005968: 1,
#21793419:
({ #c7b317f4: 13, #c68b4ed6: 1 },
{ #c7b317f4: 15, #c68b4ed6: 2 })
},
{
#c8ff724b: "available_expression",
#2cdb06fb: [ "available_expression" ]
},
[],
{ },
{
#04c0017b: {
#c709e154: <#3cf18b8d>,
#ec05e4a8: 13,
#c8ff724b: { #c8ff724b: "NSObject", #2cdb06fb: [ "NSObject" ] }
},
#d32dd232: {
#c709e154: <#c37c57de>,
#ec05e4a8: 16,
#c8ff724b: {
#c8ff724b: "available_expression",
#2cdb06fb: [ "available_expression" ]
}
}
})>,
<#0e281b68:
({
#d121c0bd: 16,
#f9005968: 1,
#21793419:
({ #c7b317f4: 17, #c68b4ed6: 1 },
{ #c7b317f4: 27, #c68b4ed6: 1 })
},
{
#c8ff724b: "available_expression",
#2cdb06fb: [ "available_expression" ]
},
[
<#3ccd3797:
({
#d121c0bd: 17,
#f9005968: 16,
#21793419:
({ #c7b317f4: 19, #c68b4ed6: 1 },
{ #c7b317f4: 25, #c68b4ed6: 1 })
},
{
#c8ff724b: "test_no_bug:and:",
#2cdb06fb: [ "test_no_bug:and:", "available_expression" ]
},
{
#3ba2c7f6: true,
#137b649c: { #c1127ea9: 18 },
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 19,
#21793419:
({ #c7b317f4: 19, #c68b4ed6: 22 },
{ #c68b4ed6: 26 })
},
{ #c8ff724b: "n", #2cdb06fb: [ "n" ] },
{ #c1127ea9: 20 },
{ #0370b1b2: 0 })>,
<#fd75cc45:
({
#d121c0bd: 21,
#21793419: ({ #c68b4ed6: 33 }, { #c68b4ed6: 56 })
},
{ #c8ff724b: "data", #2cdb06fb: [ "data" ] },
{ #c1127ea9: 22 },
{ #0370b1b2: 1 })>
],
#28dcb2c4: [
<#d0d84992:
({
#d121c0bd: 23,
#21793419: ({ }, { }),
#eb8a1f5a: true
},
{ #c8ff724b: "self", #2cdb06fb: [ "self" ] },
{ #c1127ea9: 22, #ea1a680e: true },
{ })>,
<#d0d84992:
({
#d121c0bd: 24,
#21793419: ({ }, { }),
#eb8a1f5a: true
},
{ #c8ff724b: "_cmd", #2cdb06fb: [ "_cmd" ] },
{ #c1127ea9: 5 },
{ })>
],
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 25,
#21793419:
({ #c68b4ed6: 61 },
{ #c7b317f4: 25, #c68b4ed6: 1 })
},
[
<#22219ce5:
({
#d121c0bd: 26,
#21793419:
({ #c7b317f4: 20, #c68b4ed6: 3 },
{ #c7b317f4: 21, #c68b4ed6: 3 })
},
[
<#f0f37d96:
({
#d121c0bd: 27,
#21793419:
({ #c7b317f4: 20, #c68b4ed6: 7 },
{ #c68b4ed6: 42 })
},
[],
{ #30e4876a: { #c1127ea9: 28 } },
{ #fcf1e718: "11.0" })>,
<#d394bb73:
({
#d121c0bd: 29,
#21793419:
({ #c68b4ed6: 45 },
{ #c7b317f4: 21, #c68b4ed6: 3 })
},
[])>
],
{ #c1c4b9e2: 27, #ccfc02dd: 29 })>,
<#22219ce5:
({
#d121c0bd: 30,
#21793419:
({ #c7b317f4: 23, #c68b4ed6: 3 },
{ #c7b317f4: 24, #c68b4ed6: 3 })
},
[
<#f0f37d96:
({
#d121c0bd: 31,
#21793419:
({ #c7b317f4: 23, #c68b4ed6: 7 },
{ #c68b4ed6: 48 })
},
[],
{ #30e4876a: { #c1127ea9: 28 } },
{ #fcf1e718: "8" })>,
<#d394bb73:
({
#d121c0bd: 32,
#21793419:
({ #c68b4ed6: 51 },
{ #c7b317f4: 24, #c68b4ed6: 3 })
},
[])>
],
{ #c1c4b9e2: 31, #ccfc02dd: 32 })>
])>,
#d2e9b40c: "-[available_expression test_no_bug:and:]"
})>
],
{ },
{
#2ec29bb2: {
#c709e154: <#3cf18b8d>,
#ec05e4a8: 15,
#c8ff724b: {
#c8ff724b: "available_expression",
#2cdb06fb: [ "available_expression" ]
}
}
})>,
<#0f3f4d35:
({ #d121c0bd: 33, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
34,
{ })>
],
{ },
{
#e870593a: "tests/available_expression.m",
#e52854e9: <#3ff69d49>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 18 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 28 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 35 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 36 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 37 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 20 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 39 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 40 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 41 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 43 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 44 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 45 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 70 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 72 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 73 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 74 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 77 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 78 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 79 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 80 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 81 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 82 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 83 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 84 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 85 })>,
<#2e6cf4ea: ({ #d121c0bd: 86 })>,
<#2e6cf4ea: ({ #d121c0bd: 87 })>,
<#2e6cf4ea: ({ #d121c0bd: 88 })>,
<#22d546dd: ({ #d121c0bd: 89 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 90 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 91 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 92 }, { #c1127ea9: 18 })>,
<#22d546dd: ({ #d121c0bd: 93 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 94 }, <#2fe155d3>)>,
<#d3d219f7: ({ #d121c0bd: 95 }, { #c1127ea9: 91 })>,
<#0098a8c5: ({ #d121c0bd: 96 }, { #fcd148e8: 89 })>,
<#2e3d736c: ({ #d121c0bd: 97 }, { #c1127ea9: 96 })>,
<#0098a8c5: ({ #d121c0bd: 98 }, { #fcd148e8: 90 })>,
<#2e3d736c: ({ #d121c0bd: 99 }, { #c1127ea9: 98 })>,
<#2374f4e7: ({ #d121c0bd: 100 }, 9)>,
<#d80cb60b: ({ #d121c0bd: 101 }, 102)>,
<#d3d219f7: ({ #d121c0bd: 103 }, { #c1127ea9: 20, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 104 }, { #c1127ea9: 35, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 105 }, { #c1127ea9: 35 })>,
<#d80cb60b: ({ #d121c0bd: 106 }, 107)>,
<#da0c5ecf:
({ #d121c0bd: 108 },
{ #cd26765d: { #c1127ea9: 106 }, #11302019: 24 },
1)>,
<#2374f4e7: ({ #d121c0bd: 109 }, 13)>,
<#2374f4e7: ({ #d121c0bd: 110 }, 15)>,
<#2e3d736c: ({ #d121c0bd: 22 }, { #c1127ea9: 110 })>,
<#19e1ef85:
({ #d121c0bd: 7, #26f32be5: 97 },
{ #0b680f7d: { #c1127ea9: 97 }, #c3687459: 6 })>,
<#19e1ef85:
({ #d121c0bd: 34, #26f32be5: 97 },
{ #0b680f7d: { #c1127ea9: 7 }, #c3687459: 33 })>,
<#19e1ef85:
({ #d121c0bd: 5, #26f32be5: 95 },
{ #0b680f7d: { #c1127ea9: 95 }, #c3687459: 4 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,553 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#f50d797e:
({
#d121c0bd: 7,
#f9005968: 1,
#21793419:
({
#c3bbce7c: "tests/bind_temporary.cpp",
#c7b317f4: 7,
#c68b4ed6: 1
},
{ #c7b317f4: 11, #c68b4ed6: 1 }),
#d3368c8a: true
},
{ #c8ff724b: "S", #2cdb06fb: [ "S" ] },
8,
[
<#f50d797e:
({
#d121c0bd: 9,
#f9005968: 7,
#21793419:
({ #c7b317f4: 7, #c68b4ed6: 1 }, { #c68b4ed6: 8 }),
#eb8a1f5a: true,
#d3368c8a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "S", #2cdb06fb: [ "S", "S" ] },
8,
[],
{ },
<#c5b1f8a9>,
{ #33244202: 0 },
{ })>,
<#1cd5be29:
({
#d121c0bd: 10,
#21793419:
({ #c7b317f4: 8, #c68b4ed6: 2 }, { #c68b4ed6: 8 }),
#0b0695a4: <#1b87f4c9>
})>,
<#cc498dc1:
({
#d121c0bd: 11,
#f9005968: 7,
#21793419:
({ #c7b317f4: 9, #c68b4ed6: 3 }, { #c68b4ed6: 8 }),
#0a16e1f2: true,
#d3368c8a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "S", #2cdb06fb: [ "S", "S" ] },
{ #c1127ea9: 12 },
{
#d2e9b40c: "320519083853435709",
#f1a45f0e: true,
#ebe3c415: 11,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 13,
#21793419: ({ #c68b4ed6: 7 }, { #c68b4ed6: 8 })
},
[])>
},
{ })>,
<#cfe47fa6:
({
#d121c0bd: 14,
#f9005968: 7,
#21793419:
({ #c7b317f4: 10, #c68b4ed6: 3 }, { #c68b4ed6: 9 }),
#0a16e1f2: true,
#d3368c8a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "~S", #2cdb06fb: [ "~S", "S" ] },
{ #c1127ea9: 15 },
{
#d2e9b40c: "3243028866176254141",
#f1a45f0e: true,
#ebe3c415: 14,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 16,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 9 })
},
[])>
},
{ })>,
<#cc498dc1:
({
#d121c0bd: 17,
#f9005968: 7,
#21793419:
({ #c7b317f4: 7, #c68b4ed6: 8 }, { #c68b4ed6: 8 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "S", #2cdb06fb: [ "S", "S" ] },
{ #c1127ea9: 18 },
{
#d2e9b40c: "1635307583371793064",
#f1a45f0e: true,
#3e64314e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 19,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 8 })
},
{ #c8ff724b: "", #2cdb06fb: [ "" ] },
{ #c1127ea9: 20 },
{ #0370b1b2: 0 })>
]
},
{ #fe288443: true })>
],
{ },
<#c5b1f8a9>,
{ #33244202: 7, #1a9a7e84: true },
{
#1411db39: {
#c709e154: <#3266451c>,
#ec05e4a8: 14,
#c8ff724b: { #c8ff724b: "~S", #2cdb06fb: [ "~S", "S" ] },
#30e4876a: { #c1127ea9: 15 }
}
})>,
<#f173dfc2:
({
#d121c0bd: 21,
#21793419:
({ #c7b317f4: 12, #c68b4ed6: 1 },
{ #c7b317f4: 14, #c68b4ed6: 1 })
},
{ #c8ff724b: "test", #2cdb06fb: [ "test" ] },
{ #c1127ea9: 12 },
{
#d2e9b40c: "18241244337164948030",
#f1a45f0e: true,
#ebe3c415: 21,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 22,
#21793419:
({ #c7b317f4: 12, #c68b4ed6: 13 },
{ #c7b317f4: 14, #c68b4ed6: 1 })
},
[
<#152ea3f2:
({
#d121c0bd: 23,
#21793419:
({ #c7b317f4: 13, #c68b4ed6: 3 },
{ #c68b4ed6: 23 })
},
[
<#d0cddcea:
({
#d121c0bd: 24,
#21793419:
({ #c68b4ed6: 20 }, { #c68b4ed6: 22 })
},
[
<#c27b9a39:
({
#d121c0bd: 25,
#21793419:
({ #c68b4ed6: 20 }, { #c68b4ed6: 22 })
},
[
<#c3b129f9:
({
#d121c0bd: 26,
#21793419:
({ #c68b4ed6: 20 },
{ #c68b4ed6: 22 })
},
[
<#d27fbfe6:
({
#d121c0bd: 27,
#21793419:
({ #c68b4ed6: 20 },
{ #c68b4ed6: 22 })
},
[
<#1b3b8242:
({
#d121c0bd: 28,
#21793419:
({ #c68b4ed6: 20 },
{ #c68b4ed6: 22 })
},
[],
{
#30e4876a: {
#c1127ea9: 8
}
},
{
#c369ebbe: {
#c709e154:
<#034d69b7>,
#ec05e4a8: 11,
#c8ff724b: {
#c8ff724b: "S",
#2cdb06fb: [
"S", "S"
]
},
#30e4876a: {
#c1127ea9: 12
}
}
})>
],
{
#30e4876a: { #c1127ea9: 8 }
},
{ #e715f735: 29 })>
],
{
#30e4876a: {
#c1127ea9: 8,
#ea1a680e: true
}
},
{
#c91e0a14: <#33e323e2>,
#fa1a3bd3: []
})>
],
{
#30e4876a: {
#c1127ea9: 8,
#ea1a680e: true
},
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 30,
#c8ff724b: {
#c8ff724b: "s_ref",
#2cdb06fb: [ "s_ref" ]
},
#30e4876a: { #c1127ea9: 20 }
}
})>
],
{
#30e4876a: { #c1127ea9: 8, #ea1a680e: true },
#0e89e422: <#28055b85>
},
{ })>
],
[
<#11c182d1:
({
#d121c0bd: 30,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 22 })
},
{ #c8ff724b: "s_ref", #2cdb06fb: [ "s_ref" ] },
{ #c1127ea9: 20 },
{
#fe93c404:
<#d0cddcea:
({
#d121c0bd: 24,
#21793419:
({ #c68b4ed6: 20 },
{ #c68b4ed6: 22 })
},
[
<#c27b9a39:
({
#d121c0bd: 25,
#21793419:
({ #c68b4ed6: 20 },
{ #c68b4ed6: 22 })
},
[
<#c3b129f9:
({
#d121c0bd: 26,
#21793419:
({ #c68b4ed6: 20 },
{ #c68b4ed6: 22 })
},
[
<#d27fbfe6:
({
#d121c0bd: 27,
#21793419:
({
#c68b4ed6: 20
},
{
#c68b4ed6: 22
})
},
[
<#1b3b8242:
({
#d121c0bd: 28,
#21793419:
({
#c68b4ed6:
20
},
{
#c68b4ed6:
22
})
},
[],
{
#30e4876a: {
#c1127ea9:
8
}
},
{
#c369ebbe: {
#c709e154:
<#034d69b7>,
#ec05e4a8:
11,
#c8ff724b: {
#c8ff724b:
"S",
#2cdb06fb: [
"S", "S"
]
},
#30e4876a: {
#c1127ea9:
12
}
}
})>
],
{
#30e4876a: {
#c1127ea9: 8
}
},
{ #e715f735: 29 })>
],
{
#30e4876a: {
#c1127ea9: 8,
#ea1a680e: true
}
},
{
#c91e0a14: <#33e323e2>,
#fa1a3bd3: []
})>
],
{
#30e4876a: {
#c1127ea9: 8,
#ea1a680e: true
},
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 30,
#c8ff724b: {
#c8ff724b: "s_ref",
#2cdb06fb: [ "s_ref" ]
},
#30e4876a: { #c1127ea9: 20 }
}
})>
],
{
#30e4876a: {
#c1127ea9: 8,
#ea1a680e: true
},
#0e89e422: <#28055b85>
},
{ })>
})>
])>
])>
})>,
<#0f3f4d35:
({ #d121c0bd: 31, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
32,
{ })>
],
{ },
{
#e870593a: "tests/bind_temporary.cpp",
#e52854e9: <#1e1941e6>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 33 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 34 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 35 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 36 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 37 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 39 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 40 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 41 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 43 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 44 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 45 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 70 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 72 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 73 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 74 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 77 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 78 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 79 }, <#ec09df5b>)>,
<#22d546dd: ({ #d121c0bd: 80 }, <#ec09e115>)>,
<#22d546dd: ({ #d121c0bd: 81 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 82 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 83 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 84 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 85 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 86 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 87 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 88 })>,
<#2e6cf4ea: ({ #d121c0bd: 89 })>,
<#2e6cf4ea: ({ #d121c0bd: 90 })>,
<#2e6cf4ea: ({ #d121c0bd: 91 })>,
<#22d546dd: ({ #d121c0bd: 92 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 93 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 94 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 95 }, { #c1127ea9: 33 })>,
<#22d546dd: ({ #d121c0bd: 96 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 97 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 98 }, 99)>,
<#d3d219f7: ({ #d121c0bd: 100 }, { #c1127ea9: 38, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 101 }, { #c1127ea9: 35, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 102 }, { #c1127ea9: 35 })>,
<#d80cb60b: ({ #d121c0bd: 103 }, 104)>,
<#da0c5ecf:
({ #d121c0bd: 105 },
{ #cd26765d: { #c1127ea9: 103 }, #11302019: 24 },
1)>,
<#d80cb60b: ({ #d121c0bd: 8 }, 7)>,
<#d3d219f7: ({ #d121c0bd: 106 }, { #c1127ea9: 8 })>,
<#26796f6a:
({ #d121c0bd: 12 }, { #f9c96be9: { #c1127ea9: 33 } }, { })>,
<#26796f6a:
({ #d121c0bd: 107 }, { #f9c96be9: { #c1127ea9: 33 } }, { })>,
<#26796f6a:
({ #d121c0bd: 15 }, { #f9c96be9: { #c1127ea9: 33 } }, { })>,
<#0b08cd60: ({ #d121c0bd: 20 }, { #c1127ea9: 8, #ea1a680e: true })>,
<#26796f6a:
({ #d121c0bd: 108 },
{ #f9c96be9: { #c1127ea9: 33 } },
{ #08ec7593: [ { #c1127ea9: 20 } ] })>,
<#26796f6a:
({ #d121c0bd: 18 },
{ #f9c96be9: { #c1127ea9: 33 } },
{ #08ec7593: [ { #c1127ea9: 20 } ] })>,
<#0098a8c5: ({ #d121c0bd: 109 }, { #fcd148e8: 92 })>,
<#2e3d736c: ({ #d121c0bd: 110 }, { #c1127ea9: 109 })>,
<#19e1ef85:
({ #d121c0bd: 111, #26f32be5: 110 },
{ #0b680f7d: { #c1127ea9: 110 }, #c3687459: 112 })>,
<#19e1ef85:
({ #d121c0bd: 32, #26f32be5: 110 },
{ #0b680f7d: { #c1127ea9: 111 }, #c3687459: 31 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,176 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#f173dfc2:
({
#d121c0bd: 7,
#21793419:
({
#c3bbce7c: "tests/c_attributes.c",
#c7b317f4: 7,
#c68b4ed6: 1
},
{ #c68b4ed6: 60 }),
#1771a8d7: [
<#eebf2855:
({
#d121c0bd: 8,
#21793419: ({ #c68b4ed6: 45 }, { #c68b4ed6: 58 })
},
{ #251950e4: 0, #31ee909c: 1 })>
]
},
{ #c8ff724b: "add_all_ints", #2cdb06fb: [ "add_all_ints" ] },
{ #c1127ea9: 9 },
{
#ed526254: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 10,
#21793419: ({ #c68b4ed6: 18 }, { #c68b4ed6: 22 })
},
{ #c8ff724b: "a", #2cdb06fb: [ "a" ] },
{ #c1127ea9: 11 },
{ #0370b1b2: 0 })>
]
})>,
<#0f3f4d35:
({ #d121c0bd: 12, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
13,
{ })>
],
{ },
{
#e870593a: "tests/c_attributes.c",
#e52854e9: <#3079cf66>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 14 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 15 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 16 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 17 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 18 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 11 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 19 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 20 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 21 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 22 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 23 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 24 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 25 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 26 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 27 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 28 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 29 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 30 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 31 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 32 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 33 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 34 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 35 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 36 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 37 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 39 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 40 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 41 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 43 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 44 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 45 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 66 })>,
<#2e6cf4ea: ({ #d121c0bd: 67 })>,
<#2e6cf4ea: ({ #d121c0bd: 68 })>,
<#2e6cf4ea: ({ #d121c0bd: 69 })>,
<#22d546dd: ({ #d121c0bd: 70 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 72 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 73 }, { #c1127ea9: 14 })>,
<#22d546dd: ({ #d121c0bd: 74 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 76 }, 77)>,
<#d3d219f7: ({ #d121c0bd: 78 }, { #c1127ea9: 11, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 79 }, { #c1127ea9: 16, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 80 }, { #c1127ea9: 16 })>,
<#d80cb60b: ({ #d121c0bd: 81 }, 82)>,
<#da0c5ecf:
({ #d121c0bd: 83 },
{ #cd26765d: { #c1127ea9: 81 }, #11302019: 24 },
1)>,
<#26796f6a:
({ #d121c0bd: 9 },
{ #f9c96be9: { #c1127ea9: 11 } },
{ #08ec7593: [ { #c1127ea9: 11 } ] })>,
<#0098a8c5: ({ #d121c0bd: 84 }, { #fcd148e8: 70 })>,
<#2e3d736c: ({ #d121c0bd: 85 }, { #c1127ea9: 84 })>,
<#19e1ef85:
({ #d121c0bd: 86, #26f32be5: 85 },
{ #0b680f7d: { #c1127ea9: 85 }, #c3687459: 87 })>,
<#19e1ef85:
({ #d121c0bd: 13, #26f32be5: 85 },
{ #0b680f7d: { #c1127ea9: 86 }, #c3687459: 12 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,287 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#11c182d1:
({
#d121c0bd: 7,
#21793419:
({ #c3bbce7c: "tests/c_cast.cpp", #c7b317f4: 7, #c68b4ed6: 1 },
{ #c68b4ed6: 9 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "i", #2cdb06fb: [ "i" ] },
{ #c1127ea9: 8 },
{
#ccd69858: true,
#fe93c404:
<#0fb8fb71:
({
#d121c0bd: 9,
#21793419: ({ #c68b4ed6: 9 }, { #c68b4ed6: 9 })
},
[],
{ #30e4876a: { #c1127ea9: 8 } },
{ #d9aa98d1: true, #1f65f619: 32, #31b87f71: "10" })>
})>,
<#11c182d1:
({
#d121c0bd: 10,
#21793419: ({ #c7b317f4: 8, #c68b4ed6: 1 }, { #c68b4ed6: 16 })
},
{ #c8ff724b: "l", #2cdb06fb: [ "l" ] },
{ #c1127ea9: 11 },
{
#ccd69858: true,
#fe93c404:
<#ca9fafa2:
({
#d121c0bd: 12,
#21793419: ({ #c68b4ed6: 10 }, { #c68b4ed6: 16 })
},
[
<#c3b129f9:
({
#d121c0bd: 13,
#21793419: ({ #c68b4ed6: 16 }, { #c68b4ed6: 16 })
},
[
<#c3b129f9:
({
#d121c0bd: 14,
#21793419:
({ #c68b4ed6: 16 }, { #c68b4ed6: 16 })
},
[
<#e9db58be:
({
#d121c0bd: 15,
#21793419:
({ #c68b4ed6: 16 }, { #c68b4ed6: 16 })
},
[],
{
#30e4876a: { #c1127ea9: 8 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 7,
#c8ff724b: {
#c8ff724b: "i",
#2cdb06fb: [ "i" ]
},
#30e4876a: { #c1127ea9: 8 }
}
})>
],
{ #30e4876a: { #c1127ea9: 8 } },
{ #c91e0a14: <#f7495e1f>, #fa1a3bd3: [] })>
],
{ #30e4876a: { #c1127ea9: 11 } },
{ #c91e0a14: <#2677d46b>, #fa1a3bd3: [] })>
],
{ #30e4876a: { #c1127ea9: 11 } },
{ #c91e0a14: <#33e323e2>, #fa1a3bd3: [] },
{ #c1127ea9: 11 })>
})>,
<#11c182d1:
({
#d121c0bd: 16,
#21793419: ({ #c7b317f4: 9, #c68b4ed6: 1 }, { #c68b4ed6: 16 })
},
{ #c8ff724b: "m", #2cdb06fb: [ "m" ] },
{ #c1127ea9: 11 },
{
#ccd69858: true,
#fe93c404:
<#3f28859a:
({
#d121c0bd: 17,
#21793419: ({ #c68b4ed6: 10 }, { #c68b4ed6: 16 })
},
[
<#c3b129f9:
({
#d121c0bd: 18,
#21793419: ({ #c68b4ed6: 15 }, { #c68b4ed6: 15 })
},
[
<#c3b129f9:
({
#d121c0bd: 19,
#21793419:
({ #c68b4ed6: 15 }, { #c68b4ed6: 15 })
},
[
<#e9db58be:
({
#d121c0bd: 20,
#21793419:
({ #c68b4ed6: 15 }, { #c68b4ed6: 15 })
},
[],
{
#30e4876a: { #c1127ea9: 8 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 7,
#c8ff724b: {
#c8ff724b: "i",
#2cdb06fb: [ "i" ]
},
#30e4876a: { #c1127ea9: 8 }
}
})>
],
{ #30e4876a: { #c1127ea9: 8 } },
{ #c91e0a14: <#f7495e1f>, #fa1a3bd3: [] })>
],
{ #30e4876a: { #c1127ea9: 11 } },
{ #c91e0a14: <#2677d46b>, #fa1a3bd3: [] })>
],
{ #30e4876a: { #c1127ea9: 11 } },
{ #c91e0a14: <#33e323e2>, #fa1a3bd3: [] },
{ #c1127ea9: 11 })>
})>,
<#0f3f4d35:
({ #d121c0bd: 21, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
22,
{ })>
],
{ },
{
#e870593a: "tests/c_cast.cpp",
#e52854e9: <#1e1941e6>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 23 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 24 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 25 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 26 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 27 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 8 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 11 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 28 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 29 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 30 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 31 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 32 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 33 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 34 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 35 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 36 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 37 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 39 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 40 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 41 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 43 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 44 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 45 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#ec09df5b>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#ec09e115>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 70 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 72 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 73 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 74 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 76 })>,
<#2e6cf4ea: ({ #d121c0bd: 77 })>,
<#2e6cf4ea: ({ #d121c0bd: 78 })>,
<#2e6cf4ea: ({ #d121c0bd: 79 })>,
<#22d546dd: ({ #d121c0bd: 80 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 81 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 82 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 83 }, { #c1127ea9: 23 })>,
<#22d546dd: ({ #d121c0bd: 84 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 85 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 86 }, 87)>,
<#d3d219f7: ({ #d121c0bd: 88 }, { #c1127ea9: 8, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 89 }, { #c1127ea9: 25, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 90 }, { #c1127ea9: 25 })>,
<#d80cb60b: ({ #d121c0bd: 91 }, 92)>,
<#da0c5ecf:
({ #d121c0bd: 93 },
{ #cd26765d: { #c1127ea9: 91 }, #11302019: 24 },
1)>,
<#0098a8c5: ({ #d121c0bd: 94 }, { #fcd148e8: 80 })>,
<#2e3d736c: ({ #d121c0bd: 95 }, { #c1127ea9: 94 })>,
<#19e1ef85:
({ #d121c0bd: 96, #26f32be5: 95 },
{ #0b680f7d: { #c1127ea9: 95 }, #c3687459: 97 })>,
<#19e1ef85:
({ #d121c0bd: 22, #26f32be5: 95 },
{ #0b680f7d: { #c1127ea9: 96 }, #c3687459: 21 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,160 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#f173dfc2:
({
#d121c0bd: 7,
#21793419:
({ #c3bbce7c: "tests/comments.c", #c7b317f4: 8, #c68b4ed6: 1 },
{ #c7b317f4: 11, #c68b4ed6: 1 })
},
{ #c8ff724b: "foo", #2cdb06fb: [ "foo" ] },
{ #c1127ea9: 8 },
{
#ebe3c415: 7,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 9,
#21793419:
({ #c7b317f4: 8, #c68b4ed6: 12 },
{ #c7b317f4: 11, #c68b4ed6: 1 })
},
[])>
})>,
<#0f3f4d35:
({ #d121c0bd: 10, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
11,
{ })>
],
{ },
{
#e870593a: "tests/comments.c",
#e52854e9: <#3079cf66>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 12 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 13 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 14 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 15 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 16 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 17 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 18 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 19 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 20 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 21 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 22 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 23 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 24 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 25 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 26 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 27 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 28 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 29 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 30 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 31 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 32 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 33 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 34 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 35 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 36 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 37 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 39 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 40 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 41 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 43 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 44 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 45 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 65 })>,
<#2e6cf4ea: ({ #d121c0bd: 66 })>,
<#2e6cf4ea: ({ #d121c0bd: 67 })>,
<#2e6cf4ea: ({ #d121c0bd: 68 })>,
<#22d546dd: ({ #d121c0bd: 69 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 70 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 72 }, { #c1127ea9: 12 })>,
<#22d546dd: ({ #d121c0bd: 73 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 74 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 75 }, 76)>,
<#d3d219f7: ({ #d121c0bd: 77 }, { #c1127ea9: 17, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 78 }, { #c1127ea9: 14, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 79 }, { #c1127ea9: 14 })>,
<#d80cb60b: ({ #d121c0bd: 80 }, 81)>,
<#da0c5ecf:
({ #d121c0bd: 82 },
{ #cd26765d: { #c1127ea9: 80 }, #11302019: 24 },
1)>,
<#01fe18e9: ({ #d121c0bd: 8 }, { #f9c96be9: { #c1127ea9: 12 } })>,
<#0098a8c5: ({ #d121c0bd: 83 }, { #fcd148e8: 69 })>,
<#2e3d736c: ({ #d121c0bd: 84 }, { #c1127ea9: 83 })>,
<#19e1ef85:
({ #d121c0bd: 85, #26f32be5: 84 },
{ #0b680f7d: { #c1127ea9: 84 }, #c3687459: 86 })>,
<#19e1ef85:
({ #d121c0bd: 11, #26f32be5: 84 },
{ #0b680f7d: { #c1127ea9: 85 }, #c3687459: 10 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,443 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#f50d797e:
({
#d121c0bd: 7,
#f9005968: 1,
#21793419:
({
#c3bbce7c: "tests/const_cast.cpp",
#c7b317f4: 7,
#c68b4ed6: 1
},
{ #c7b317f4: 10, #c68b4ed6: 1 }),
#d3368c8a: true
},
{ #c8ff724b: "Foo", #2cdb06fb: [ "Foo" ] },
8,
[
<#f50d797e:
({
#d121c0bd: 9,
#f9005968: 7,
#21793419:
({ #c7b317f4: 7, #c68b4ed6: 1 }, { #c68b4ed6: 7 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "Foo", #2cdb06fb: [ "Foo", "Foo" ] },
8,
[],
{ },
<#01fae064>,
{ #33244202: 0 },
{ })>,
<#1cd5be29:
({
#d121c0bd: 10,
#21793419:
({ #c7b317f4: 8, #c68b4ed6: 2 }, { #c68b4ed6: 8 }),
#0b0695a4: <#1b87f4c9>
})>,
<#29ca61ce:
({
#d121c0bd: 11,
#f9005968: 7,
#21793419:
({ #c7b317f4: 9, #c68b4ed6: 3 }, { #c68b4ed6: 16 }),
#0a16e1f2: true,
#d3368c8a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "func", #2cdb06fb: [ "func", "Foo" ] },
{ #c1127ea9: 12 },
{
#d2e9b40c: "999725558640074098",
#f1a45f0e: true,
#ebe3c415: 11,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 13,
#21793419: ({ #c68b4ed6: 15 }, { #c68b4ed6: 16 })
},
[])>
},
{ })>
],
{ },
<#01fae064>,
{ #33244202: 7, #1a9a7e84: true },
{ #f1ae3b70: true })>,
<#f173dfc2:
({
#d121c0bd: 14,
#21793419:
({ #c7b317f4: 12, #c68b4ed6: 1 },
{ #c7b317f4: 15, #c68b4ed6: 1 })
},
{ #c8ff724b: "someFunction", #2cdb06fb: [ "someFunction" ] },
{ #c1127ea9: 15 },
{
#d2e9b40c: "9689270513361838995",
#f1a45f0e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 16,
#21793419:
({ #c7b317f4: 12, #c68b4ed6: 19 }, { #c68b4ed6: 30 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "f", #2cdb06fb: [ "f" ] },
{ #c1127ea9: 17 },
{ #0370b1b2: 0 })>
],
#ebe3c415: 14,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 18,
#21793419:
({ #c68b4ed6: 33 }, { #c7b317f4: 15, #c68b4ed6: 1 })
},
[
<#152ea3f2:
({
#d121c0bd: 19,
#21793419:
({ #c7b317f4: 13, #c68b4ed6: 3 },
{ #c68b4ed6: 35 })
},
[
<#0acc0a14:
({
#d121c0bd: 20,
#21793419:
({ #c68b4ed6: 15 }, { #c68b4ed6: 34 })
},
[
<#e9db58be:
({
#d121c0bd: 21,
#21793419:
({ #c68b4ed6: 33 }, { #c68b4ed6: 33 })
},
[],
{
#30e4876a: {
#c1127ea9: 8,
#ea1a680e: true
},
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#334f163b>,
#ec05e4a8: 16,
#c8ff724b: {
#c8ff724b: "f",
#2cdb06fb: [ "f" ]
},
#30e4876a: { #c1127ea9: 17 }
}
})>
],
{
#30e4876a: { #c1127ea9: 8 },
#0e89e422: <#28055b85>
},
{ #c91e0a14: <#33e323e2>, #fa1a3bd3: [] },
{ #c1127ea9: 22 },
"const_cast")>
],
[
<#11c182d1:
({
#d121c0bd: 23,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 34 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "fRef", #2cdb06fb: [ "fRef" ] },
{ #c1127ea9: 22 },
{
#fe93c404:
<#0acc0a14:
({
#d121c0bd: 20,
#21793419:
({ #c68b4ed6: 15 },
{ #c68b4ed6: 34 })
},
[
<#e9db58be:
({
#d121c0bd: 21,
#21793419:
({ #c68b4ed6: 33 },
{ #c68b4ed6: 33 })
},
[],
{
#30e4876a: {
#c1127ea9: 8,
#ea1a680e: true
},
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#334f163b>,
#ec05e4a8: 16,
#c8ff724b: {
#c8ff724b: "f",
#2cdb06fb: [ "f" ]
},
#30e4876a: { #c1127ea9: 17 }
}
})>
],
{
#30e4876a: { #c1127ea9: 8 },
#0e89e422: <#28055b85>
},
{
#c91e0a14: <#33e323e2>,
#fa1a3bd3: []
},
{ #c1127ea9: 22 },
"const_cast")>
})>
])>,
<#ee1808d0:
({
#d121c0bd: 24,
#21793419:
({ #c7b317f4: 14, #c68b4ed6: 3 },
{ #c68b4ed6: 13 })
},
[
<#090744cf:
({
#d121c0bd: 25,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 8 })
},
[
<#e9db58be:
({
#d121c0bd: 26,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 3 })
},
[],
{
#30e4876a: { #c1127ea9: 8 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 23,
#c8ff724b: {
#c8ff724b: "fRef",
#2cdb06fb: [ "fRef" ]
},
#30e4876a: { #c1127ea9: 22 }
}
})>
],
{ #30e4876a: { #c1127ea9: 27 } },
{
#f708701b: true,
#c8ff724b: {
#c8ff724b: "func",
#2cdb06fb: [ "func", "Foo" ]
},
#c369ebbe: {
#c709e154: <#e7d5f344>,
#ec05e4a8: 11,
#c8ff724b: {
#c8ff724b: "func",
#2cdb06fb: [ "func", "Foo" ]
},
#30e4876a: { #c1127ea9: 12 }
}
})>
],
{ #30e4876a: { #c1127ea9: 28 } })>
])>
})>,
<#11c182d1:
({
#d121c0bd: 29,
#21793419: ({ #c7b317f4: 17, #c68b4ed6: 1 }, { #c68b4ed6: 19 })
},
{ #c8ff724b: "i", #2cdb06fb: [ "i" ] },
{ #c1127ea9: 30, #ea1a680e: true },
{
#ccd69858: true,
#e45abe46: true,
#dd3d1991: true,
#fe93c404:
<#0fb8fb71:
({
#d121c0bd: 31,
#21793419: ({ #c68b4ed6: 19 }, { #c68b4ed6: 19 })
},
[],
{ #30e4876a: { #c1127ea9: 30 } },
{ #d9aa98d1: true, #1f65f619: 32, #31b87f71: "1" })>
})>,
<#0f3f4d35:
({ #d121c0bd: 32, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
33,
{ })>
],
{ },
{
#e870593a: "tests/const_cast.cpp",
#e52854e9: <#1e1941e6>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 28 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 34 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 35 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 36 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 37 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 30 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 39 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 40 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 41 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 43 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 44 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 45 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 70 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 72 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 73 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 74 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 77 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 78 }, <#ec09df5b>)>,
<#22d546dd: ({ #d121c0bd: 79 }, <#ec09e115>)>,
<#22d546dd: ({ #d121c0bd: 80 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 81 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 27 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 82 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 83 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 84 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 85 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 86 })>,
<#2e6cf4ea: ({ #d121c0bd: 87 })>,
<#2e6cf4ea: ({ #d121c0bd: 88 })>,
<#2e6cf4ea: ({ #d121c0bd: 89 })>,
<#22d546dd: ({ #d121c0bd: 90 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 91 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 92 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 93 }, { #c1127ea9: 28 })>,
<#22d546dd: ({ #d121c0bd: 94 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 95 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 96 }, 97)>,
<#d3d219f7: ({ #d121c0bd: 98 }, { #c1127ea9: 30, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 99 }, { #c1127ea9: 35, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 100 }, { #c1127ea9: 35 })>,
<#d80cb60b: ({ #d121c0bd: 101 }, 102)>,
<#da0c5ecf:
({ #d121c0bd: 103 },
{ #cd26765d: { #c1127ea9: 101 }, #11302019: 24 },
1)>,
<#d80cb60b: ({ #d121c0bd: 8 }, 7)>,
<#d3d219f7: ({ #d121c0bd: 104 }, { #c1127ea9: 8 })>,
<#26796f6a:
({ #d121c0bd: 12 }, { #f9c96be9: { #c1127ea9: 28 } }, { })>,
<#0b08cd60: ({ #d121c0bd: 17 }, { #c1127ea9: 8, #ea1a680e: true })>,
<#26796f6a:
({ #d121c0bd: 15 },
{ #f9c96be9: { #c1127ea9: 28 } },
{ #08ec7593: [ { #c1127ea9: 17 } ] })>,
<#0b08cd60: ({ #d121c0bd: 22 }, { #c1127ea9: 8 })>,
<#d3d219f7: ({ #d121c0bd: 105 }, { #c1127ea9: 8, #ea1a680e: true })>,
<#0098a8c5: ({ #d121c0bd: 106 }, { #fcd148e8: 90 })>,
<#2e3d736c: ({ #d121c0bd: 107 }, { #c1127ea9: 106 })>,
<#19e1ef85:
({ #d121c0bd: 108, #26f32be5: 107 },
{ #0b680f7d: { #c1127ea9: 107 }, #c3687459: 109 })>,
<#19e1ef85:
({ #d121c0bd: 33, #26f32be5: 107 },
{ #0b680f7d: { #c1127ea9: 108 }, #c3687459: 32 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,6 @@
#/bin/bash
# Copyright (c) 2015-present, Facebook, Inc.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
"$@" | bdump

@ -0,0 +1,420 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#37b901fc:
({
#d121c0bd: 7,
#21793419:
({ #c3bbce7c: "tests/friend.cpp", #c7b317f4: 8, #c68b4ed6: 1 },
{ #c7b317f4: 9, #c68b4ed6: 22 })
},
{ #c8ff724b: "AnotherClass", #2cdb06fb: [ "AnotherClass" ] },
{
#dfe08e08: [
<#e0b96727:
({
#d121c0bd: 8,
#f9005968: 1,
#21793419:
({ #c7b317f4: 8, #c68b4ed6: 1 },
{ #c7b317f4: 9, #c68b4ed6: 22 })
},
{
#c8ff724b: "AnotherClass",
#2cdb06fb: [ "AnotherClass<int *>" ]
},
9,
[],
{ },
<#c5b1f8a9>,
{ #33244202: 0 },
{ },
"8348715085918813141",
{
#e43971cf: 7,
#0de52551: [ <#37e21eda: { #c1127ea9: 10 }> ]
})>
]
})>,
<#37b901fc:
({
#d121c0bd: 11,
#21793419:
({ #c7b317f4: 11, #c68b4ed6: 1 },
{ #c7b317f4: 16, #c68b4ed6: 1 })
},
{ #c8ff724b: "Y", #2cdb06fb: [ "Y" ] },
{
#dfe08e08: [
<#e0b96727:
({
#d121c0bd: 12,
#f9005968: 1,
#21793419:
({ #c7b317f4: 11, #c68b4ed6: 1 },
{ #c7b317f4: 16, #c68b4ed6: 1 })
},
{ #c8ff724b: "Y", #2cdb06fb: [ "Y<int>" ] },
13,
[
<#f50d797e:
({
#d121c0bd: 14,
#f9005968: 12,
#21793419:
({ #c7b317f4: 12, #c68b4ed6: 1 },
{ #c68b4ed6: 8 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "Y", #2cdb06fb: [ "Y", "Y<int>" ] },
13,
[],
{ },
<#c5b1f8a9>,
{ #33244202: 12 },
{ })>,
<#1e196208:
({
#d121c0bd: 15,
#21793419:
({ #c7b317f4: 13, #c68b4ed6: 3 },
{ #c68b4ed6: 32 }),
#0b0695a4: <#1b87f4c9>
},
<#37e21eda: 16>)>,
<#1e196208:
({
#d121c0bd: 17,
#21793419:
({ #c7b317f4: 14, #c68b4ed6: 3 },
{ #c7b317f4: 15, #c68b4ed6: 16 }),
#0b0695a4: <#1b87f4c9>
},
<#2d3f7c8a:
<#37b901fc:
({
#d121c0bd: 18,
#f9005968: 1,
#21793419:
({ #c7b317f4: 14, #c68b4ed6: 3 },
{ #c7b317f4: 15, #c68b4ed6: 16 })
},
{
#c8ff724b: "AnotherClass",
#2cdb06fb: [ "AnotherClass" ]
},
{ })>>)>,
<#cc498dc1:
({
#d121c0bd: 19,
#f9005968: 12,
#21793419:
({ #c7b317f4: 12, #c68b4ed6: 8 },
{ #c68b4ed6: 8 }),
#eb8a1f5a: true,
#0a16e1f2: true,
#d3368c8a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "Y", #2cdb06fb: [ "Y", "Y<int>" ] },
{ #c1127ea9: 20 },
{
#d2e9b40c: "17039860285578718334",
#f1a45f0e: true,
#3e64314e: true,
#ebe3c415: 19,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 21,
#21793419:
({ #c68b4ed6: 8 }, { #c68b4ed6: 8 })
},
[])>
},
{ #fe288443: true })>,
<#cc498dc1:
({
#d121c0bd: 22,
#f9005968: 12,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 8 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "Y", #2cdb06fb: [ "Y", "Y<int>" ] },
{ #c1127ea9: 23 },
{
#d2e9b40c: "10269173081916450237",
#f1a45f0e: true,
#3e64314e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 24,
#21793419:
({ #c68b4ed6: 8 }, { #c68b4ed6: 8 })
},
{ #c8ff724b: "", #2cdb06fb: [ "" ] },
{ #c1127ea9: 25 },
{ #0370b1b2: 0 })>
]
},
{ #fe288443: true })>,
<#cc498dc1:
({
#d121c0bd: 26,
#f9005968: 12,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 8 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "Y", #2cdb06fb: [ "Y", "Y<int>" ] },
{ #c1127ea9: 27 },
{
#d2e9b40c: "15856009432989426751",
#f1a45f0e: true,
#3e64314e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 28,
#21793419:
({ #c68b4ed6: 8 }, { #c68b4ed6: 8 })
},
{ #c8ff724b: "", #2cdb06fb: [ "" ] },
{ #c1127ea9: 29 },
{ #0370b1b2: 0 })>
]
},
{ #fe288443: true })>
],
{ },
<#c5b1f8a9>,
{ #33244202: 12, #1a9a7e84: true },
{ #f1ae3b70: true },
"12207844931495093295",
{
#e43971cf: 11,
#0de52551: [ <#37e21eda: { #c1127ea9: 30 }> ]
})>
]
})>,
<#11c182d1:
({
#d121c0bd: 31,
#21793419: ({ #c7b317f4: 18, #c68b4ed6: 1 }, { #c68b4ed6: 8 })
},
{ #c8ff724b: "y1", #2cdb06fb: [ "y1" ] },
{ #c1127ea9: 32 },
{
#ccd69858: true,
#fe93c404:
<#e5067ee9:
({
#d121c0bd: 33,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 8 })
},
[],
{ #30e4876a: { #c1127ea9: 32 } },
{
#c369ebbe: {
#c709e154: <#034d69b7>,
#ec05e4a8: 19,
#c8ff724b: {
#c8ff724b: "Y",
#2cdb06fb: [ "Y", "Y<int>" ]
},
#30e4876a: { #c1127ea9: 20 }
}
})>
})>,
<#0f3f4d35:
({ #d121c0bd: 34, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
35,
{ })>
],
{ },
{
#e870593a: "tests/friend.cpp",
#e52854e9: <#1e1941e6>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 36 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 37 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 39 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 40 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 30 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 41 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 43 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 44 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 45 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 70 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 72 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 73 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 74 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 77 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 78 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 79 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 80 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 81 }, <#ec09df5b>)>,
<#22d546dd: ({ #d121c0bd: 82 }, <#ec09e115>)>,
<#22d546dd: ({ #d121c0bd: 83 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 84 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 85 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 86 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 87 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 88 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 89 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 90 })>,
<#2e6cf4ea: ({ #d121c0bd: 91 })>,
<#2e6cf4ea: ({ #d121c0bd: 92 })>,
<#2e6cf4ea: ({ #d121c0bd: 93 })>,
<#22d546dd: ({ #d121c0bd: 94 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 95 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 96 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 97 }, { #c1127ea9: 36 })>,
<#22d546dd: ({ #d121c0bd: 98 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 99 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 100 }, 101)>,
<#d3d219f7: ({ #d121c0bd: 102 }, { #c1127ea9: 30, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 103 }, { #c1127ea9: 38, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 104 }, { #c1127ea9: 38 })>,
<#d80cb60b: ({ #d121c0bd: 105 }, 106)>,
<#da0c5ecf:
({ #d121c0bd: 107 },
{ #cd26765d: { #c1127ea9: 105 }, #11302019: 24 },
1)>,
<#f3f3711a: ({ #d121c0bd: 108 })>,
<#f3f3711a: ({ #d121c0bd: 109 })>,
<#ece2635f: ({ #d121c0bd: 110 })>,
<#ece2635f: ({ #d121c0bd: 111 })>,
<#d49f978d: ({ #d121c0bd: 112 })>,
<#f3f3711a: ({ #d121c0bd: 113 })>,
<#ece2635f: ({ #d121c0bd: 114 })>,
<#ece2635f: ({ #d121c0bd: 115 })>,
<#d49f978d: ({ #d121c0bd: 116 })>,
<#d3d219f7: ({ #d121c0bd: 117 }, { #c1127ea9: 108 })>,
<#d3d219f7: ({ #d121c0bd: 118 }, { #c1127ea9: 113 })>,
<#ece2635f: ({ #d121c0bd: 119 })>,
<#ece2635f: ({ #d121c0bd: 120 })>,
<#263b5f37: ({ #d121c0bd: 121, #26f32be5: 120 })>,
<#f3f3711a: ({ #d121c0bd: 122 })>,
<#f3f3711a: ({ #d121c0bd: 123 })>,
<#ece2635f: ({ #d121c0bd: 124 })>,
<#ece2635f: ({ #d121c0bd: 125 })>,
<#d49f978d: ({ #d121c0bd: 126 })>,
<#d80cb60b: ({ #d121c0bd: 13 }, 12)>,
<#ece2635f: ({ #d121c0bd: 32, #26f32be5: 13 })>,
<#dd64b59b: ({ #d121c0bd: 127, #26f32be5: 30 })>,
<#d3d219f7: ({ #d121c0bd: 10 }, { #c1127ea9: 30 })>,
<#d3d219f7: ({ #d121c0bd: 128 }, { #c1127ea9: 127 })>,
<#d80cb60b: ({ #d121c0bd: 9 }, 8)>,
<#ece2635f: ({ #d121c0bd: 129, #26f32be5: 9 })>,
<#263b5f37: ({ #d121c0bd: 16, #26f32be5: 9 })>,
<#f3f3711a: ({ #d121c0bd: 130 })>,
<#26796f6a:
({ #d121c0bd: 131 }, { #f9c96be9: { #c1127ea9: 36 } }, { })>,
<#26796f6a:
({ #d121c0bd: 132 }, { #f9c96be9: { #c1127ea9: 36 } }, { })>,
<#0b08cd60: ({ #d121c0bd: 25 }, { #c1127ea9: 13, #ea1a680e: true })>,
<#26796f6a:
({ #d121c0bd: 133 },
{ #f9c96be9: { #c1127ea9: 36 } },
{ #08ec7593: [ { #c1127ea9: 25 } ] })>,
<#26796f6a:
({ #d121c0bd: 23 },
{ #f9c96be9: { #c1127ea9: 36 } },
{ #08ec7593: [ { #c1127ea9: 25 } ] })>,
<#295746e6: ({ #d121c0bd: 29 }, { #c1127ea9: 13 })>,
<#26796f6a:
({ #d121c0bd: 134 },
{ #f9c96be9: { #c1127ea9: 36 } },
{ #08ec7593: [ { #c1127ea9: 29 } ] })>,
<#26796f6a:
({ #d121c0bd: 27 },
{ #f9c96be9: { #c1127ea9: 36 } },
{ #08ec7593: [ { #c1127ea9: 29 } ] })>,
<#26796f6a:
({ #d121c0bd: 20 }, { #f9c96be9: { #c1127ea9: 36 } }, { })>,
<#0098a8c5: ({ #d121c0bd: 135 }, { #fcd148e8: 94 })>,
<#2e3d736c: ({ #d121c0bd: 136 }, { #c1127ea9: 135 })>,
<#19e1ef85:
({ #d121c0bd: 137, #26f32be5: 136 },
{ #0b680f7d: { #c1127ea9: 136 }, #c3687459: 138 })>,
<#19e1ef85:
({ #d121c0bd: 35, #26f32be5: 136 },
{ #0b680f7d: { #c1127ea9: 137 }, #c3687459: 34 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,885 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#c589b11c:
({
#d121c0bd: 7,
#21793419:
({
#c3bbce7c: "tests/function_template.cpp",
#c7b317f4: 8,
#c68b4ed6: 1
},
{ #c7b317f4: 11, #c68b4ed6: 1 })
},
{ #c8ff724b: "get", #2cdb06fb: [ "get" ] },
{
#dfe08e08: [
<#f173dfc2:
({
#d121c0bd: 8,
#21793419:
({ #c7b317f4: 9, #c68b4ed6: 1 },
{ #c7b317f4: 11, #c68b4ed6: 1 })
},
{ #c8ff724b: "get", #2cdb06fb: [ "get<double>" ] },
{ #c1127ea9: 9 },
{
#d2e9b40c: "18441705267350886400",
#f1a45f0e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 10,
#21793419:
({ #c7b317f4: 9, #c68b4ed6: 7 },
{ #c68b4ed6: 9 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "x", #2cdb06fb: [ "x" ] },
{ #c1127ea9: 11 },
{ #0370b1b2: 0 })>
],
#ebe3c415: 8,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 12,
#21793419:
({ #c68b4ed6: 12 },
{ #c7b317f4: 11, #c68b4ed6: 1 })
},
[
<#df3bdb38:
({
#d121c0bd: 13,
#21793419:
({ #c7b317f4: 10, #c68b4ed6: 3 },
{ #c68b4ed6: 10 })
},
[
<#c3b129f9:
({
#d121c0bd: 14,
#21793419:
({ #c68b4ed6: 10 },
{ #c68b4ed6: 10 })
},
[
<#e9db58be:
({
#d121c0bd: 15,
#21793419:
({ #c68b4ed6: 10 },
{ #c68b4ed6: 10 })
},
[],
{
#30e4876a: { #c1127ea9: 11 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#334f163b>,
#ec05e4a8: 10,
#c8ff724b: {
#c8ff724b: "x",
#2cdb06fb: [ "x" ]
},
#30e4876a: { #c1127ea9: 11 }
}
})>
],
{ #30e4876a: { #c1127ea9: 11 } },
{
#c91e0a14: <#f7495e1f>,
#fa1a3bd3: []
})>
])>
])>,
#f3c2adb0: {
#e43971cf: 7,
#0de52551: [ <#37e21eda: { #c1127ea9: 16 }> ]
}
})>,
<#f173dfc2:
({
#d121c0bd: 17,
#21793419:
({ #c7b317f4: 9, #c68b4ed6: 1 },
{ #c7b317f4: 11, #c68b4ed6: 1 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "get", #2cdb06fb: [ "get<char>" ] },
{ #c1127ea9: 18 },
{
#d2e9b40c: "1909523640421882241",
#f1a45f0e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 19,
#21793419:
({ #c7b317f4: 9, #c68b4ed6: 7 },
{ #c68b4ed6: 9 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "x", #2cdb06fb: [ "x" ] },
{ #c1127ea9: 20 },
{ #0370b1b2: 0 })>
],
#ebe3c415: 17,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 21,
#21793419:
({ #c68b4ed6: 12 },
{ #c7b317f4: 11, #c68b4ed6: 1 })
},
[
<#df3bdb38:
({
#d121c0bd: 22,
#21793419:
({ #c7b317f4: 10, #c68b4ed6: 3 },
{ #c68b4ed6: 10 })
},
[
<#c3b129f9:
({
#d121c0bd: 23,
#21793419:
({ #c68b4ed6: 10 },
{ #c68b4ed6: 10 })
},
[
<#e9db58be:
({
#d121c0bd: 24,
#21793419:
({ #c68b4ed6: 10 },
{ #c68b4ed6: 10 })
},
[],
{
#30e4876a: { #c1127ea9: 20 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#334f163b>,
#ec05e4a8: 19,
#c8ff724b: {
#c8ff724b: "x",
#2cdb06fb: [ "x" ]
},
#30e4876a: { #c1127ea9: 20 }
}
})>
],
{ #30e4876a: { #c1127ea9: 20 } },
{
#c91e0a14: <#f7495e1f>,
#fa1a3bd3: []
})>
])>
])>,
#f3c2adb0: {
#e43971cf: 7,
#0de52551: [ <#37e21eda: { #c1127ea9: 25 }> ]
}
})>,
<#f173dfc2:
({
#d121c0bd: 26,
#21793419:
({ #c7b317f4: 9, #c68b4ed6: 1 },
{ #c7b317f4: 11, #c68b4ed6: 1 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "get", #2cdb06fb: [ "get<float>" ] },
{ #c1127ea9: 27 },
{
#d2e9b40c: "2862116284697721030",
#f1a45f0e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 28,
#21793419:
({ #c7b317f4: 9, #c68b4ed6: 7 },
{ #c68b4ed6: 9 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "x", #2cdb06fb: [ "x" ] },
{ #c1127ea9: 29 },
{ #0370b1b2: 0 })>
],
#ebe3c415: 26,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 30,
#21793419:
({ #c68b4ed6: 12 },
{ #c7b317f4: 11, #c68b4ed6: 1 })
},
[
<#df3bdb38:
({
#d121c0bd: 31,
#21793419:
({ #c7b317f4: 10, #c68b4ed6: 3 },
{ #c68b4ed6: 10 })
},
[
<#c3b129f9:
({
#d121c0bd: 32,
#21793419:
({ #c68b4ed6: 10 },
{ #c68b4ed6: 10 })
},
[
<#e9db58be:
({
#d121c0bd: 33,
#21793419:
({ #c68b4ed6: 10 },
{ #c68b4ed6: 10 })
},
[],
{
#30e4876a: { #c1127ea9: 29 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#334f163b>,
#ec05e4a8: 28,
#c8ff724b: {
#c8ff724b: "x",
#2cdb06fb: [ "x" ]
},
#30e4876a: { #c1127ea9: 29 }
}
})>
],
{ #30e4876a: { #c1127ea9: 29 } },
{
#c91e0a14: <#f7495e1f>,
#fa1a3bd3: []
})>
])>
])>,
#f3c2adb0: {
#e43971cf: 7,
#0de52551: [ <#37e21eda: { #c1127ea9: 34 }> ]
}
})>
]
})>,
<#f173dfc2:
({
#d121c0bd: 35,
#21793419:
({ #c7b317f4: 14, #c68b4ed6: 1 },
{ #c7b317f4: 17, #c68b4ed6: 1 })
},
{ #c8ff724b: "get", #2cdb06fb: [ "get<int>" ] },
{ #c1127ea9: 36 },
{
#d2e9b40c: "8674435321115121355",
#f1a45f0e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 37,
#21793419:
({ #c7b317f4: 15, #c68b4ed6: 9 }, { #c68b4ed6: 13 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "x", #2cdb06fb: [ "x" ] },
{ #c1127ea9: 38 },
{ #0370b1b2: 0 })>
],
#ebe3c415: 35,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 39,
#21793419:
({ #c68b4ed6: 16 }, { #c7b317f4: 17, #c68b4ed6: 1 })
},
[
<#df3bdb38:
({
#d121c0bd: 40,
#21793419:
({ #c7b317f4: 16, #c68b4ed6: 3 },
{ #c68b4ed6: 14 })
},
[
<#d49390e5:
({
#d121c0bd: 41,
#21793419:
({ #c68b4ed6: 10 }, { #c68b4ed6: 14 })
},
[
<#0fb8fb71:
({
#d121c0bd: 42,
#21793419:
({ #c68b4ed6: 10 }, { #c68b4ed6: 10 })
},
[],
{ #30e4876a: { #c1127ea9: 38 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "2"
})>,
<#c3b129f9:
({
#d121c0bd: 43,
#21793419:
({ #c68b4ed6: 14 }, { #c68b4ed6: 14 })
},
[
<#e9db58be:
({
#d121c0bd: 44,
#21793419:
({ #c68b4ed6: 14 },
{ #c68b4ed6: 14 })
},
[],
{
#30e4876a: { #c1127ea9: 38 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#334f163b>,
#ec05e4a8: 37,
#c8ff724b: {
#c8ff724b: "x",
#2cdb06fb: [ "x" ]
},
#30e4876a: { #c1127ea9: 38 }
}
})>
],
{ #30e4876a: { #c1127ea9: 38 } },
{ #c91e0a14: <#f7495e1f>, #fa1a3bd3: [] })>
],
{ #30e4876a: { #c1127ea9: 38 } },
{ #c709e154: <#003ad3e4> })>
])>
])>,
#f3c2adb0: {
#e43971cf: 7,
#0de52551: [ <#37e21eda: { #c1127ea9: 38 }> ]
}
})>,
<#f173dfc2:
({
#d121c0bd: 45,
#21793419:
({ #c7b317f4: 22, #c68b4ed6: 1 },
{ #c7b317f4: 27, #c68b4ed6: 1 })
},
{ #c8ff724b: "test", #2cdb06fb: [ "test" ] },
{ #c1127ea9: 46 },
{
#d2e9b40c: "18241244337164948030",
#f1a45f0e: true,
#ebe3c415: 45,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 47,
#21793419:
({ #c7b317f4: 22, #c68b4ed6: 13 },
{ #c7b317f4: 27, #c68b4ed6: 1 })
},
[
<#152ea3f2:
({
#d121c0bd: 48,
#21793419:
({ #c7b317f4: 23, #c68b4ed6: 3 },
{ #c68b4ed6: 9 })
},
[],
[
<#11c182d1:
({
#d121c0bd: 49,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 8 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "c", #2cdb06fb: [ "c" ] },
{ #c1127ea9: 25 },
{ })>
])>,
<#152ea3f2:
({
#d121c0bd: 50,
#21793419:
({ #c7b317f4: 24, #c68b4ed6: 3 },
{ #c68b4ed6: 10 })
},
[],
[
<#11c182d1:
({
#d121c0bd: 51,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 9 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "f", #2cdb06fb: [ "f" ] },
{ #c1127ea9: 34 },
{ })>
])>,
<#d49390e5:
({
#d121c0bd: 52,
#21793419:
({ #c7b317f4: 25, #c68b4ed6: 3 },
{ #c68b4ed6: 12 })
},
[
<#e9db58be:
({
#d121c0bd: 53,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 3 })
},
[],
{
#30e4876a: { #c1127ea9: 25 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 49,
#c8ff724b: {
#c8ff724b: "c",
#2cdb06fb: [ "c" ]
},
#30e4876a: { #c1127ea9: 25 }
}
})>,
<#c59ea513:
({
#d121c0bd: 54,
#21793419:
({ #c68b4ed6: 7 }, { #c68b4ed6: 12 })
},
[
<#c3b129f9:
({
#d121c0bd: 55,
#21793419:
({ #c68b4ed6: 7 }, { #c68b4ed6: 7 })
},
[
<#e9db58be:
({
#d121c0bd: 56,
#21793419:
({ #c68b4ed6: 7 },
{ #c68b4ed6: 7 })
},
[],
{
#30e4876a: { #c1127ea9: 18 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#ee046738>,
#ec05e4a8: 17,
#c8ff724b: {
#c8ff724b: "get",
#2cdb06fb: [ "get<char>" ]
},
#30e4876a: { #c1127ea9: 18 }
},
#e3ab889b: {
#c709e154: <#de0c0392>,
#ec05e4a8: 7,
#c8ff724b: {
#c8ff724b: "get",
#2cdb06fb: [ "get" ]
}
}
})>
],
{ #30e4876a: { #c1127ea9: 57 } },
{ #c91e0a14: <#210490b0>, #fa1a3bd3: [] })>,
<#c3b129f9:
({
#d121c0bd: 58,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[
<#e9db58be:
({
#d121c0bd: 59,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{
#30e4876a: { #c1127ea9: 25 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 49,
#c8ff724b: {
#c8ff724b: "c",
#2cdb06fb: [ "c" ]
},
#30e4876a: { #c1127ea9: 25 }
}
})>
],
{ #30e4876a: { #c1127ea9: 25 } },
{ #c91e0a14: <#f7495e1f>, #fa1a3bd3: [] })>
],
{ #30e4876a: { #c1127ea9: 20 } })>
],
{
#30e4876a: { #c1127ea9: 25 },
#0e89e422: <#28055b85>
},
{ #c709e154: <#009aba4f> })>,
<#d49390e5:
({
#d121c0bd: 60,
#21793419:
({ #c7b317f4: 26, #c68b4ed6: 3 },
{ #c68b4ed6: 12 })
},
[
<#e9db58be:
({
#d121c0bd: 61,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 3 })
},
[],
{
#30e4876a: { #c1127ea9: 34 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 51,
#c8ff724b: {
#c8ff724b: "f",
#2cdb06fb: [ "f" ]
},
#30e4876a: { #c1127ea9: 34 }
}
})>,
<#c59ea513:
({
#d121c0bd: 62,
#21793419:
({ #c68b4ed6: 7 }, { #c68b4ed6: 12 })
},
[
<#c3b129f9:
({
#d121c0bd: 63,
#21793419:
({ #c68b4ed6: 7 }, { #c68b4ed6: 7 })
},
[
<#e9db58be:
({
#d121c0bd: 64,
#21793419:
({ #c68b4ed6: 7 },
{ #c68b4ed6: 7 })
},
[],
{
#30e4876a: { #c1127ea9: 27 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#ee046738>,
#ec05e4a8: 26,
#c8ff724b: {
#c8ff724b: "get",
#2cdb06fb: [ "get<float>" ]
},
#30e4876a: { #c1127ea9: 27 }
},
#e3ab889b: {
#c709e154: <#de0c0392>,
#ec05e4a8: 7,
#c8ff724b: {
#c8ff724b: "get",
#2cdb06fb: [ "get" ]
}
}
})>
],
{ #30e4876a: { #c1127ea9: 65 } },
{ #c91e0a14: <#210490b0>, #fa1a3bd3: [] })>,
<#c3b129f9:
({
#d121c0bd: 66,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[
<#e9db58be:
({
#d121c0bd: 67,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{
#30e4876a: { #c1127ea9: 34 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 51,
#c8ff724b: {
#c8ff724b: "f",
#2cdb06fb: [ "f" ]
},
#30e4876a: { #c1127ea9: 34 }
}
})>
],
{ #30e4876a: { #c1127ea9: 34 } },
{ #c91e0a14: <#f7495e1f>, #fa1a3bd3: [] })>
],
{ #30e4876a: { #c1127ea9: 29 } })>
],
{
#30e4876a: { #c1127ea9: 34 },
#0e89e422: <#28055b85>
},
{ #c709e154: <#009aba4f> })>
])>
})>,
<#0f3f4d35:
({ #d121c0bd: 68, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
69,
{ })>
],
{ },
{
#e870593a: "tests/function_template.cpp",
#e52854e9: <#1e1941e6>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 70 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 25 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 72 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 73 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 74 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 77 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 78 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 79 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 80 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 34 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 16 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 81 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 82 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 83 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 84 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 85 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 86 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 87 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 88 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 89 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 90 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 91 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 92 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 93 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 94 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 95 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 96 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 97 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 98 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 99 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 100 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 101 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 102 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 103 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 104 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 105 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 106 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 107 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 108 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 109 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 110 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 111 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 112 }, <#ec09df5b>)>,
<#22d546dd: ({ #d121c0bd: 113 }, <#ec09e115>)>,
<#22d546dd: ({ #d121c0bd: 114 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 115 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 116 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 117 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 118 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 119 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 120 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 121 })>,
<#2e6cf4ea: ({ #d121c0bd: 122 })>,
<#2e6cf4ea: ({ #d121c0bd: 123 })>,
<#2e6cf4ea: ({ #d121c0bd: 124 })>,
<#22d546dd: ({ #d121c0bd: 125 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 126 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 127 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 128 }, { #c1127ea9: 70 })>,
<#22d546dd: ({ #d121c0bd: 129 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 130 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 131 }, 132)>,
<#d3d219f7: ({ #d121c0bd: 133 }, { #c1127ea9: 38, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 134 }, { #c1127ea9: 25, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 135 }, { #c1127ea9: 25 })>,
<#d80cb60b: ({ #d121c0bd: 136 }, 137)>,
<#da0c5ecf:
({ #d121c0bd: 138 },
{ #cd26765d: { #c1127ea9: 136 }, #11302019: 24 },
1)>,
<#f3f3711a: ({ #d121c0bd: 139 })>,
<#f3f3711a: ({ #d121c0bd: 140 })>,
<#26796f6a:
({ #d121c0bd: 141 },
{ #f9c96be9: { #c1127ea9: 139 } },
{ #08ec7593: [ { #c1127ea9: 139 } ] })>,
<#26796f6a:
({ #d121c0bd: 142 },
{ #f9c96be9: { #c1127ea9: 140 } },
{ #08ec7593: [ { #c1127ea9: 140 } ] })>,
<#26796f6a:
({ #d121c0bd: 36 },
{ #f9c96be9: { #c1127ea9: 38 } },
{ #08ec7593: [ { #c1127ea9: 38 } ] })>,
<#dd64b59b: ({ #d121c0bd: 143, #26f32be5: 38 })>,
<#26796f6a:
({ #d121c0bd: 144 },
{ #f9c96be9: { #c1127ea9: 143 } },
{ #08ec7593: [ { #c1127ea9: 143 } ] })>,
<#26796f6a:
({ #d121c0bd: 145 },
{ #f9c96be9: { #c1127ea9: 16 } },
{ #08ec7593: [ { #c1127ea9: 16 } ] })>,
<#dd64b59b: ({ #d121c0bd: 11, #26f32be5: 16 })>,
<#26796f6a:
({ #d121c0bd: 9 },
{ #f9c96be9: { #c1127ea9: 11 } },
{ #08ec7593: [ { #c1127ea9: 11 } ] })>,
<#26796f6a:
({ #d121c0bd: 46 }, { #f9c96be9: { #c1127ea9: 70 } }, { })>,
<#dd64b59b: ({ #d121c0bd: 20, #26f32be5: 25 })>,
<#26796f6a:
({ #d121c0bd: 146 },
{ #f9c96be9: { #c1127ea9: 25 } },
{ #08ec7593: [ { #c1127ea9: 25 } ] })>,
<#26796f6a:
({ #d121c0bd: 18 },
{ #f9c96be9: { #c1127ea9: 20 } },
{ #08ec7593: [ { #c1127ea9: 20 } ] })>,
<#d3d219f7: ({ #d121c0bd: 147 }, { #c1127ea9: 146 })>,
<#d3d219f7: ({ #d121c0bd: 57 }, { #c1127ea9: 18 })>,
<#dd64b59b: ({ #d121c0bd: 29, #26f32be5: 34 })>,
<#26796f6a:
({ #d121c0bd: 148 },
{ #f9c96be9: { #c1127ea9: 34 } },
{ #08ec7593: [ { #c1127ea9: 34 } ] })>,
<#26796f6a:
({ #d121c0bd: 27 },
{ #f9c96be9: { #c1127ea9: 29 } },
{ #08ec7593: [ { #c1127ea9: 29 } ] })>,
<#d3d219f7: ({ #d121c0bd: 149 }, { #c1127ea9: 148 })>,
<#d3d219f7: ({ #d121c0bd: 65 }, { #c1127ea9: 27 })>,
<#0098a8c5: ({ #d121c0bd: 150 }, { #fcd148e8: 125 })>,
<#2e3d736c: ({ #d121c0bd: 151 }, { #c1127ea9: 150 })>,
<#19e1ef85:
({ #d121c0bd: 152, #26f32be5: 151 },
{ #0b680f7d: { #c1127ea9: 151 }, #c3687459: 153 })>,
<#19e1ef85:
({ #d121c0bd: 69, #26f32be5: 151 },
{ #0b680f7d: { #c1127ea9: 152 }, #c3687459: 68 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,897 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#f173dfc2:
({
#d121c0bd: 7,
#21793419:
({
#c3bbce7c: "tests/generic_selector_expression.c",
#c7b317f4: 9,
#c68b4ed6: 1
},
{ #c7b317f4: 15, #c68b4ed6: 1 })
},
{ #c8ff724b: "test_typename", #2cdb06fb: [ "test_typename" ] },
{ #c1127ea9: 8 },
{
#ebe3c415: 7,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 9,
#21793419:
({ #c7b317f4: 9, #c68b4ed6: 25 },
{ #c7b317f4: 15, #c68b4ed6: 1 })
},
[
<#152ea3f2:
({
#d121c0bd: 10,
#21793419:
({ #c7b317f4: 10, #c68b4ed6: 3 },
{ #c68b4ed6: 9 })
},
[],
[
<#11c182d1:
({
#d121c0bd: 11,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 8 }),
#d3368c8a: true
},
{ #c8ff724b: "s", #2cdb06fb: [ "s" ] },
{ #c1127ea9: 12 },
{ })>
])>,
<#152ea3f2:
({
#d121c0bd: 13,
#21793419:
({ #c7b317f4: 11, #c68b4ed6: 3 },
{ #c68b4ed6: 8 })
},
[],
[
<#11c182d1:
({
#d121c0bd: 14,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 7 }),
#d3368c8a: true
},
{ #c8ff724b: "y", #2cdb06fb: [ "y" ] },
{ #c1127ea9: 15 },
{ })>
])>,
<#152ea3f2:
({
#d121c0bd: 16,
#21793419:
({ #c7b317f4: 12, #c68b4ed6: 3 },
{ #c68b4ed6: 18 })
},
[
<#c835bf2a:
({
#d121c0bd: 17,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[
<#c3b129f9:
({
#d121c0bd: 18,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[
<#02335a3f:
({
#d121c0bd: 19,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[
<#e9db58be:
({
#d121c0bd: 20,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{
#30e4876a: {
#c1127ea9: 12
},
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 11,
#c8ff724b: {
#c8ff724b: "s",
#2cdb06fb: [ "s" ]
},
#30e4876a: {
#c1127ea9: 12
}
}
})>
],
{
#30e4876a: { #c1127ea9: 12 },
#0e89e422: <#28055b85>
})>
],
{ #30e4876a: { #c1127ea9: 12 } },
{ #c91e0a14: <#f7495e1f>, #fa1a3bd3: [] })>,
<#0fb8fb71:
({
#d121c0bd: 21,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "1"
})>,
<#0fb8fb71:
({
#d121c0bd: 22,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "2"
})>,
<#0fb8fb71:
({
#d121c0bd: 23,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "3"
})>,
<#0fb8fb71:
({
#d121c0bd: 24,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "4"
})>
],
{ #30e4876a: { #c1127ea9: 15 } },
{
#31b87f71:
<#0fb8fb71:
({
#d121c0bd: 22,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "2"
})>
})>
],
[
<#11c182d1:
({
#d121c0bd: 25,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 11 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "x", #2cdb06fb: [ "x" ] },
{ #c1127ea9: 15 },
{
#fe93c404:
<#c835bf2a:
({
#d121c0bd: 17,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[
<#c3b129f9:
({
#d121c0bd: 18,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[
<#02335a3f:
({
#d121c0bd: 19,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[
<#e9db58be:
({
#d121c0bd: 20,
#21793419:
({
#c68b4ed6: 11
},
{
#c68b4ed6: 11
})
},
[],
{
#30e4876a: {
#c1127ea9: 12
},
#0e89e422:
<#28055b85>
},
{
#c369ebbe: {
#c709e154:
<#004196c7>,
#ec05e4a8: 11,
#c8ff724b: {
#c8ff724b: "s",
#2cdb06fb: [
"s"
]
},
#30e4876a: {
#c1127ea9: 12
}
}
})>
],
{
#30e4876a: {
#c1127ea9: 12
},
#0e89e422: <#28055b85>
})>
],
{ #30e4876a: { #c1127ea9: 12 } },
{
#c91e0a14: <#f7495e1f>,
#fa1a3bd3: []
})>,
<#0fb8fb71:
({
#d121c0bd: 21,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "1"
})>,
<#0fb8fb71:
({
#d121c0bd: 22,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "2"
})>,
<#0fb8fb71:
({
#d121c0bd: 23,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "3"
})>,
<#0fb8fb71:
({
#d121c0bd: 24,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "4"
})>
],
{ #30e4876a: { #c1127ea9: 15 } },
{
#31b87f71:
<#0fb8fb71:
({
#d121c0bd: 22,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{
#30e4876a: { #c1127ea9: 15 }
},
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "2"
})>
})>
})>
])>,
<#152ea3f2:
({
#d121c0bd: 26,
#21793419:
({ #c7b317f4: 13, #c68b4ed6: 3 },
{ #c68b4ed6: 18 })
},
[
<#c835bf2a:
({
#d121c0bd: 27,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[
<#c3b129f9:
({
#d121c0bd: 28,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[
<#02335a3f:
({
#d121c0bd: 29,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[
<#e9db58be:
({
#d121c0bd: 30,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{
#30e4876a: {
#c1127ea9: 15
},
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 14,
#c8ff724b: {
#c8ff724b: "y",
#2cdb06fb: [ "y" ]
},
#30e4876a: {
#c1127ea9: 15
}
}
})>
],
{
#30e4876a: { #c1127ea9: 15 },
#0e89e422: <#28055b85>
})>
],
{ #30e4876a: { #c1127ea9: 15 } },
{ #c91e0a14: <#f7495e1f>, #fa1a3bd3: [] })>,
<#0fb8fb71:
({
#d121c0bd: 31,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "1"
})>,
<#0fb8fb71:
({
#d121c0bd: 32,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "2"
})>,
<#0fb8fb71:
({
#d121c0bd: 33,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "3"
})>,
<#0fb8fb71:
({
#d121c0bd: 34,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "4"
})>
],
{ #30e4876a: { #c1127ea9: 15 } },
{
#31b87f71:
<#0fb8fb71:
({
#d121c0bd: 33,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "3"
})>
})>
],
[
<#11c182d1:
({
#d121c0bd: 35,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 11 }),
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "z", #2cdb06fb: [ "z" ] },
{ #c1127ea9: 15 },
{
#fe93c404:
<#c835bf2a:
({
#d121c0bd: 27,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[
<#c3b129f9:
({
#d121c0bd: 28,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[
<#02335a3f:
({
#d121c0bd: 29,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[
<#e9db58be:
({
#d121c0bd: 30,
#21793419:
({
#c68b4ed6: 11
},
{
#c68b4ed6: 11
})
},
[],
{
#30e4876a: {
#c1127ea9: 15
},
#0e89e422:
<#28055b85>
},
{
#c369ebbe: {
#c709e154:
<#004196c7>,
#ec05e4a8: 14,
#c8ff724b: {
#c8ff724b: "y",
#2cdb06fb: [
"y"
]
},
#30e4876a: {
#c1127ea9: 15
}
}
})>
],
{
#30e4876a: {
#c1127ea9: 15
},
#0e89e422: <#28055b85>
})>
],
{ #30e4876a: { #c1127ea9: 15 } },
{
#c91e0a14: <#f7495e1f>,
#fa1a3bd3: []
})>,
<#0fb8fb71:
({
#d121c0bd: 31,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "1"
})>,
<#0fb8fb71:
({
#d121c0bd: 32,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "2"
})>,
<#0fb8fb71:
({
#d121c0bd: 33,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "3"
})>,
<#0fb8fb71:
({
#d121c0bd: 34,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "4"
})>
],
{ #30e4876a: { #c1127ea9: 15 } },
{
#31b87f71:
<#0fb8fb71:
({
#d121c0bd: 33,
#21793419:
({ #c68b4ed6: 11 },
{ #c68b4ed6: 11 })
},
[],
{
#30e4876a: { #c1127ea9: 15 }
},
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "3"
})>
})>
})>
])>,
<#df3bdb38:
({
#d121c0bd: 36,
#21793419:
({ #c7b317f4: 14, #c68b4ed6: 3 },
{ #c68b4ed6: 14 })
},
[
<#d49390e5:
({
#d121c0bd: 37,
#21793419:
({ #c68b4ed6: 10 }, { #c68b4ed6: 14 })
},
[
<#c3b129f9:
({
#d121c0bd: 38,
#21793419:
({ #c68b4ed6: 10 }, { #c68b4ed6: 10 })
},
[
<#e9db58be:
({
#d121c0bd: 39,
#21793419:
({ #c68b4ed6: 10 },
{ #c68b4ed6: 10 })
},
[],
{
#30e4876a: { #c1127ea9: 15 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 25,
#c8ff724b: {
#c8ff724b: "x",
#2cdb06fb: [ "x" ]
},
#30e4876a: { #c1127ea9: 15 }
}
})>
],
{ #30e4876a: { #c1127ea9: 15 } },
{ #c91e0a14: <#f7495e1f>, #fa1a3bd3: [] })>,
<#c3b129f9:
({
#d121c0bd: 40,
#21793419:
({ #c68b4ed6: 14 }, { #c68b4ed6: 14 })
},
[
<#e9db58be:
({
#d121c0bd: 41,
#21793419:
({ #c68b4ed6: 14 },
{ #c68b4ed6: 14 })
},
[],
{
#30e4876a: { #c1127ea9: 15 },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 35,
#c8ff724b: {
#c8ff724b: "z",
#2cdb06fb: [ "z" ]
},
#30e4876a: { #c1127ea9: 15 }
}
})>
],
{ #30e4876a: { #c1127ea9: 15 } },
{ #c91e0a14: <#f7495e1f>, #fa1a3bd3: [] })>
],
{ #30e4876a: { #c1127ea9: 15 } },
{ #c709e154: <#0031aa01> })>
])>
])>
})>,
<#21116177:
({
#d121c0bd: 42,
#21793419: ({ #c7b317f4: 15, #c68b4ed6: 2 }, { #c68b4ed6: 2 })
})>,
<#0f3f4d35:
({ #d121c0bd: 43, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
44,
{ })>
],
{ },
{
#e870593a: "tests/generic_selector_expression.c",
#e52854e9: <#3079cf66>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 45 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 12 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 15 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 70 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 72 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 73 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 74 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 77 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 78 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 79 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 80 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 81 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 82 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 83 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 84 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 85 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 86 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 87 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 88 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 89 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 90 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 91 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 92 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 93 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 94 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 95 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 96 })>,
<#2e6cf4ea: ({ #d121c0bd: 97 })>,
<#2e6cf4ea: ({ #d121c0bd: 98 })>,
<#2e6cf4ea: ({ #d121c0bd: 99 })>,
<#22d546dd: ({ #d121c0bd: 100 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 101 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 102 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 103 }, { #c1127ea9: 45 })>,
<#22d546dd: ({ #d121c0bd: 104 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 105 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 106 }, 107)>,
<#d3d219f7: ({ #d121c0bd: 108 }, { #c1127ea9: 15, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 109 }, { #c1127ea9: 12, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 110 }, { #c1127ea9: 12 })>,
<#d80cb60b: ({ #d121c0bd: 111 }, 112)>,
<#da0c5ecf:
({ #d121c0bd: 113 },
{ #cd26765d: { #c1127ea9: 111 }, #11302019: 24 },
1)>,
<#26796f6a: ({ #d121c0bd: 8 }, { #f9c96be9: { #c1127ea9: 15 } }, { })>,
<#0098a8c5: ({ #d121c0bd: 114 }, { #fcd148e8: 100 })>,
<#2e3d736c: ({ #d121c0bd: 115 }, { #c1127ea9: 114 })>,
<#19e1ef85:
({ #d121c0bd: 116, #26f32be5: 115 },
{ #0b680f7d: { #c1127ea9: 115 }, #c3687459: 117 })>,
<#19e1ef85:
({ #d121c0bd: 44, #26f32be5: 115 },
{ #0b680f7d: { #c1127ea9: 116 }, #c3687459: 43 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,678 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#f50d797e:
({
#d121c0bd: 7,
#f9005968: 1,
#21793419:
({
#c3bbce7c: "tests/inheriting_constructor.cpp",
#c7b317f4: 7,
#c68b4ed6: 1
},
{ #c7b317f4: 10, #c68b4ed6: 1 }),
#d3368c8a: true
},
{ #c8ff724b: "A", #2cdb06fb: [ "A" ] },
8,
[
<#f50d797e:
({
#d121c0bd: 9,
#f9005968: 7,
#21793419:
({ #c7b317f4: 7, #c68b4ed6: 1 }, { #c68b4ed6: 8 }),
#eb8a1f5a: true,
#d3368c8a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "A", #2cdb06fb: [ "A", "A" ] },
8,
[],
{ },
<#c5b1f8a9>,
{ #33244202: 0 },
{ })>,
<#cc498dc1:
({
#d121c0bd: 10,
#f9005968: 7,
#21793419:
({ #c7b317f4: 8, #c68b4ed6: 3 }, { #c68b4ed6: 11 }),
#0a16e1f2: true,
#d3368c8a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "A", #2cdb06fb: [ "A", "A" ] },
{ #c1127ea9: 11 },
{
#d2e9b40c: "14779048587651412014",
#f1a45f0e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 12,
#21793419: ({ #c68b4ed6: 5 }, { #c68b4ed6: 5 })
},
{ #c8ff724b: "", #2cdb06fb: [ "" ] },
{ #c1127ea9: 13 },
{ #0370b1b2: 0 })>
],
#ebe3c415: 10,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 14,
#21793419: ({ #c68b4ed6: 10 }, { #c68b4ed6: 11 })
},
[])>
},
{ })>,
<#29ca61ce:
({
#d121c0bd: 15,
#f9005968: 7,
#21793419:
({ #c7b317f4: 9, #c68b4ed6: 3 }, { #c68b4ed6: 14 }),
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "foo", #2cdb06fb: [ "foo", "A" ] },
{ #c1127ea9: 16 },
{
#d2e9b40c: "11285596688767843576",
#f1a45f0e: true,
#ebe3c415: 15,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 17,
#21793419: ({ #c68b4ed6: 13 }, { #c68b4ed6: 14 })
},
[])>
},
{ })>,
<#cc498dc1:
({
#d121c0bd: 18,
#f9005968: 7,
#21793419:
({ #c7b317f4: 7, #c68b4ed6: 8 }, { #c68b4ed6: 8 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "A", #2cdb06fb: [ "A", "A" ] },
{ #c1127ea9: 19 },
{
#d2e9b40c: "3430056695640597274",
#f1a45f0e: true,
#3e64314e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 20,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 8 })
},
{ #c8ff724b: "", #2cdb06fb: [ "" ] },
{ #c1127ea9: 21 },
{ #0370b1b2: 0 })>
]
},
{ #fe288443: true })>,
<#cc498dc1:
({
#d121c0bd: 22,
#f9005968: 7,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 8 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "A", #2cdb06fb: [ "A", "A" ] },
{ #c1127ea9: 23 },
{
#d2e9b40c: "1361265890968139694",
#f1a45f0e: true,
#3e64314e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 24,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 8 })
},
{ #c8ff724b: "", #2cdb06fb: [ "" ] },
{ #c1127ea9: 25 },
{ #0370b1b2: 0 })>
]
},
{ #fe288443: true })>,
<#cfe47fa6:
({
#d121c0bd: 26,
#f9005968: 7,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 8 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "~A", #2cdb06fb: [ "~A", "A" ] },
{ #c1127ea9: 27 },
{
#d2e9b40c: "5328378654181921475",
#f1a45f0e: true,
#3e64314e: true
},
{ })>
],
{ },
<#c5b1f8a9>,
{ #33244202: 7, #1a9a7e84: true },
{
#1411db39: {
#c709e154: <#3266451c>,
#ec05e4a8: 26,
#c8ff724b: { #c8ff724b: "~A", #2cdb06fb: [ "~A", "A" ] },
#30e4876a: { #c1127ea9: 27 }
}
})>,
<#f50d797e:
({
#d121c0bd: 28,
#f9005968: 1,
#21793419:
({ #c7b317f4: 12, #c68b4ed6: 1 },
{ #c7b317f4: 14, #c68b4ed6: 1 }),
#d3368c8a: true
},
{ #c8ff724b: "B", #2cdb06fb: [ "B" ] },
29,
[
<#f50d797e:
({
#d121c0bd: 30,
#f9005968: 28,
#21793419:
({ #c7b317f4: 12, #c68b4ed6: 1 }, { #c68b4ed6: 8 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "B", #2cdb06fb: [ "B", "B" ] },
29,
[],
{ },
<#c5b1f8a9>,
{ #33244202: 0 },
{ })>,
<#c0e5c3ae:
({
#d121c0bd: 31,
#21793419:
({ #c7b317f4: 13, #c68b4ed6: 3 }, { #c68b4ed6: 12 }),
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "B", #2cdb06fb: [ "B", "B" ] })>,
<#39c4b314:
({
#d121c0bd: 32,
#21793419: ({ #c68b4ed6: 12 }, { #c68b4ed6: 12 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "B", #2cdb06fb: [ "B", "B" ] })>,
<#39c4b314:
({
#d121c0bd: 33,
#21793419: ({ #c68b4ed6: 12 }, { #c68b4ed6: 12 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "B", #2cdb06fb: [ "B", "B" ] })>,
<#39c4b314:
({
#d121c0bd: 34,
#21793419: ({ #c68b4ed6: 12 }, { #c68b4ed6: 12 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "B", #2cdb06fb: [ "B", "B" ] })>,
<#cc498dc1:
({
#d121c0bd: 35,
#f9005968: 28,
#21793419:
({ #c7b317f4: 12, #c68b4ed6: 8 }, { #c68b4ed6: 8 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "B", #2cdb06fb: [ "B", "B" ] },
{ #c1127ea9: 36 },
{
#d2e9b40c: "10798876524598897542",
#f1a45f0e: true,
#3e64314e: true
},
{ })>,
<#cc498dc1:
({
#d121c0bd: 37,
#f9005968: 28,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 8 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "B", #2cdb06fb: [ "B", "B" ] },
{ #c1127ea9: 38 },
{
#d2e9b40c: "7710293714478488613",
#f1a45f0e: true,
#3e64314e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 39,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 8 })
},
{ #c8ff724b: "", #2cdb06fb: [ "" ] },
{ #c1127ea9: 40 },
{ #0370b1b2: 0 })>
]
},
{ #fe288443: true })>,
<#cc498dc1:
({
#d121c0bd: 41,
#f9005968: 28,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 8 }),
#eb8a1f5a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "B", #2cdb06fb: [ "B", "B" ] },
{ #c1127ea9: 42 },
{
#d2e9b40c: "16903082029399050859",
#f1a45f0e: true,
#3e64314e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 43,
#21793419: ({ #c68b4ed6: 8 }, { #c68b4ed6: 8 })
},
{ #c8ff724b: "", #2cdb06fb: [ "" ] },
{ #c1127ea9: 44 },
{ #0370b1b2: 0 })>
]
},
{ #fe288443: true })>,
<#cc498dc1:
({
#d121c0bd: 45,
#f9005968: 28,
#21793419:
({ #c7b317f4: 13, #c68b4ed6: 12 }, { #c68b4ed6: 12 }),
#eb8a1f5a: true,
#0a16e1f2: true,
#d3368c8a: true,
#0b0695a4: <#1b87f4c9>
},
{ #c8ff724b: "A", #2cdb06fb: [ "A", "B" ] },
{ #c1127ea9: 46 },
{
#d2e9b40c: "18258347749069050656",
#f1a45f0e: true,
#3e64314e: true,
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 47,
#21793419: ({ #c68b4ed6: 12 }, { #c68b4ed6: 12 }),
#eb8a1f5a: true
},
{ #c8ff724b: "", #2cdb06fb: [ "" ] },
{ #c1127ea9: 13 },
{ #0370b1b2: 0 })>
],
#ebe3c415: 45,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 48,
#21793419: ({ #c68b4ed6: 12 }, { #c68b4ed6: 12 })
},
[])>
},
{
#ef684b00: [
{
#298801ac: <#fa100247: (8, false)>,
#21793419: ({ #c68b4ed6: 12 }, { #c68b4ed6: 12 }),
#fe93c404:
<#364949d0:
({
#d121c0bd: 49,
#21793419:
({ #c68b4ed6: 12 }, { #c68b4ed6: 12 })
},
[],
{ #30e4876a: { #c1127ea9: 8 } },
{
#c369ebbe: {
#c709e154: <#034d69b7>,
#ec05e4a8: 10,
#c8ff724b: {
#c8ff724b: "A",
#2cdb06fb: [ "A", "A" ]
},
#30e4876a: { #c1127ea9: 11 }
}
})>
}
]
})>
],
{ },
<#c5b1f8a9>,
{ #33244202: 28, #1a9a7e84: true },
{ #2dba2742: [ 8 ] })>,
<#f173dfc2:
({
#d121c0bd: 50,
#21793419: ({ #c7b317f4: 16, #c68b4ed6: 1 }, { #c68b4ed6: 22 })
},
{ #c8ff724b: "main", #2cdb06fb: [ "main" ] },
{ #c1127ea9: 51 },
{
#f1a45f0e: true,
#ebe3c415: 50,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 52,
#21793419: ({ #c68b4ed6: 12 }, { #c68b4ed6: 22 })
},
[
<#152ea3f2:
({
#d121c0bd: 53,
#21793419: ({ #c68b4ed6: 14 }, { #c68b4ed6: 20 })
},
[
<#e5067ee9:
({
#d121c0bd: 54,
#21793419:
({ #c68b4ed6: 16 }, { #c68b4ed6: 19 })
},
[
<#0fb8fb71:
({
#d121c0bd: 55,
#21793419:
({ #c68b4ed6: 18 }, { #c68b4ed6: 18 })
},
[],
{ #30e4876a: { #c1127ea9: 13 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "5"
})>
],
{ #30e4876a: { #c1127ea9: 29 } },
{
#c369ebbe: {
#c709e154: <#034d69b7>,
#ec05e4a8: 45,
#c8ff724b: {
#c8ff724b: "A",
#2cdb06fb: [ "A", "B" ]
},
#30e4876a: { #c1127ea9: 46 }
}
})>
],
[
<#11c182d1:
({
#d121c0bd: 56,
#21793419:
({ #c68b4ed6: 14 }, { #c68b4ed6: 19 })
},
{ #c8ff724b: "b", #2cdb06fb: [ "b" ] },
{ #c1127ea9: 29 },
{
#fe93c404:
<#e5067ee9:
({
#d121c0bd: 54,
#21793419:
({ #c68b4ed6: 16 },
{ #c68b4ed6: 19 })
},
[
<#0fb8fb71:
({
#d121c0bd: 55,
#21793419:
({ #c68b4ed6: 18 },
{ #c68b4ed6: 18 })
},
[],
{ #30e4876a: { #c1127ea9: 13 } },
{
#d9aa98d1: true,
#1f65f619: 32,
#31b87f71: "5"
})>
],
{ #30e4876a: { #c1127ea9: 29 } },
{
#c369ebbe: {
#c709e154: <#034d69b7>,
#ec05e4a8: 45,
#c8ff724b: {
#c8ff724b: "A",
#2cdb06fb: [ "A", "B" ]
},
#30e4876a: { #c1127ea9: 46 }
}
})>
})>
])>
])>
})>,
<#0f3f4d35:
({ #d121c0bd: 57, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
58,
{ })>
],
{ },
{
#e870593a: "tests/inheriting_constructor.cpp",
#e52854e9: <#1e1941e6>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 59 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 13 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 70 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 72 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 73 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 74 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 77 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 78 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 79 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 80 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 81 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 82 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 83 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 84 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 85 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 86 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 87 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 88 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 89 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 90 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 91 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 92 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 93 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 94 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 95 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 96 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 97 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 98 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 99 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 100 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 101 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 102 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 103 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 104 }, <#ec09df5b>)>,
<#22d546dd: ({ #d121c0bd: 105 }, <#ec09e115>)>,
<#22d546dd: ({ #d121c0bd: 106 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 107 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 108 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 109 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 110 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 111 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 112 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 113 })>,
<#2e6cf4ea: ({ #d121c0bd: 114 })>,
<#2e6cf4ea: ({ #d121c0bd: 115 })>,
<#2e6cf4ea: ({ #d121c0bd: 116 })>,
<#22d546dd: ({ #d121c0bd: 117 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 118 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 119 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 120 }, { #c1127ea9: 59 })>,
<#22d546dd: ({ #d121c0bd: 121 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 122 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 123 }, 124)>,
<#d3d219f7: ({ #d121c0bd: 125 }, { #c1127ea9: 13, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 126 }, { #c1127ea9: 61, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 127 }, { #c1127ea9: 61 })>,
<#d80cb60b: ({ #d121c0bd: 128 }, 129)>,
<#da0c5ecf:
({ #d121c0bd: 130 },
{ #cd26765d: { #c1127ea9: 128 }, #11302019: 24 },
1)>,
<#d80cb60b: ({ #d121c0bd: 8 }, 7)>,
<#d3d219f7: ({ #d121c0bd: 131 }, { #c1127ea9: 8 })>,
<#26796f6a:
({ #d121c0bd: 11 },
{ #f9c96be9: { #c1127ea9: 59 } },
{ #08ec7593: [ { #c1127ea9: 13 } ] })>,
<#26796f6a:
({ #d121c0bd: 16 }, { #f9c96be9: { #c1127ea9: 59 } }, { })>,
<#d80cb60b: ({ #d121c0bd: 29 }, 28)>,
<#0b08cd60: ({ #d121c0bd: 21 }, { #c1127ea9: 8, #ea1a680e: true })>,
<#26796f6a:
({ #d121c0bd: 132 },
{ #f9c96be9: { #c1127ea9: 59 } },
{ #08ec7593: [ { #c1127ea9: 21 } ] })>,
<#26796f6a:
({ #d121c0bd: 19 },
{ #f9c96be9: { #c1127ea9: 59 } },
{ #08ec7593: [ { #c1127ea9: 21 } ] })>,
<#295746e6: ({ #d121c0bd: 25 }, { #c1127ea9: 8 })>,
<#26796f6a:
({ #d121c0bd: 133 },
{ #f9c96be9: { #c1127ea9: 59 } },
{ #08ec7593: [ { #c1127ea9: 25 } ] })>,
<#26796f6a:
({ #d121c0bd: 23 },
{ #f9c96be9: { #c1127ea9: 59 } },
{ #08ec7593: [ { #c1127ea9: 25 } ] })>,
<#26796f6a:
({ #d121c0bd: 36 }, { #f9c96be9: { #c1127ea9: 59 } }, { })>,
<#0b08cd60: ({ #d121c0bd: 40 }, { #c1127ea9: 29, #ea1a680e: true })>,
<#26796f6a:
({ #d121c0bd: 134 },
{ #f9c96be9: { #c1127ea9: 59 } },
{ #08ec7593: [ { #c1127ea9: 40 } ] })>,
<#26796f6a:
({ #d121c0bd: 38 },
{ #f9c96be9: { #c1127ea9: 59 } },
{ #08ec7593: [ { #c1127ea9: 40 } ] })>,
<#26796f6a:
({ #d121c0bd: 27 }, { #f9c96be9: { #c1127ea9: 59 } }, { })>,
<#295746e6: ({ #d121c0bd: 44 }, { #c1127ea9: 29 })>,
<#26796f6a:
({ #d121c0bd: 135 },
{ #f9c96be9: { #c1127ea9: 59 } },
{ #08ec7593: [ { #c1127ea9: 44 } ] })>,
<#26796f6a:
({ #d121c0bd: 42 },
{ #f9c96be9: { #c1127ea9: 59 } },
{ #08ec7593: [ { #c1127ea9: 44 } ] })>,
<#26796f6a:
({ #d121c0bd: 51 }, { #f9c96be9: { #c1127ea9: 13 } }, { })>,
<#d3d219f7: ({ #d121c0bd: 136 }, { #c1127ea9: 127 })>,
<#26796f6a:
({ #d121c0bd: 137 },
{ #f9c96be9: { #c1127ea9: 59 } },
{ #08ec7593: [ { #c1127ea9: 13 } ] })>,
<#26796f6a:
({ #d121c0bd: 46 },
{ #f9c96be9: { #c1127ea9: 59 } },
{ #08ec7593: [ { #c1127ea9: 13 } ] })>,
<#0098a8c5: ({ #d121c0bd: 138 }, { #fcd148e8: 117 })>,
<#2e3d736c: ({ #d121c0bd: 139 }, { #c1127ea9: 138 })>,
<#19e1ef85:
({ #d121c0bd: 140, #26f32be5: 139 },
{ #0b680f7d: { #c1127ea9: 139 }, #c3687459: 141 })>,
<#19e1ef85:
({ #d121c0bd: 58, #26f32be5: 139 },
{ #0b680f7d: { #c1127ea9: 140 }, #c3687459: 57 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,211 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#11c182d1:
({
#d121c0bd: 7,
#21793419:
({
#c3bbce7c: "tests/materialize_temporary.cpp",
#c7b317f4: 7,
#c68b4ed6: 1
},
{ #c68b4ed6: 16 })
},
{ #c8ff724b: "r", #2cdb06fb: [ "r" ] },
{ #c1127ea9: 8 },
{
#ccd69858: true,
#dd3d1991: true,
#fe93c404:
<#d0cddcea:
({
#d121c0bd: 9,
#21793419: ({ #c68b4ed6: 16 }, { #c68b4ed6: 16 })
},
[
<#c27b9a39:
({
#d121c0bd: 10,
#21793419: ({ #c68b4ed6: 16 }, { #c68b4ed6: 16 })
},
[
<#c3b129f9:
({
#d121c0bd: 11,
#21793419:
({ #c68b4ed6: 16 }, { #c68b4ed6: 16 })
},
[
<#d1b36d29:
({
#d121c0bd: 12,
#21793419:
({ #c68b4ed6: 16 }, { #c68b4ed6: 16 })
},
[],
{ #30e4876a: { #c1127ea9: 13 } },
"1")>
],
{
#30e4876a: { #c1127ea9: 14, #ea1a680e: true }
},
{ #c91e0a14: <#0da6788d>, #fa1a3bd3: [] })>
],
{
#30e4876a: { #c1127ea9: 14, #ea1a680e: true },
#0e89e422: <#28055b85>
},
{
#c369ebbe: {
#c709e154: <#004196c7>,
#ec05e4a8: 7,
#c8ff724b: { #c8ff724b: "r", #2cdb06fb: [ "r" ] },
#30e4876a: { #c1127ea9: 8 }
}
})>
],
{
#30e4876a: { #c1127ea9: 14, #ea1a680e: true },
#0e89e422: <#28055b85>
},
{ })>
})>,
<#0f3f4d35:
({ #d121c0bd: 15, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
16,
{ })>
],
{ },
{
#e870593a: "tests/materialize_temporary.cpp",
#e52854e9: <#1e1941e6>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 17 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 18 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 19 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 20 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 21 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 14 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 22 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 23 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 24 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 25 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 26 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 27 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 28 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 29 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 13 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 30 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 31 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 32 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 33 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 34 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 35 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 36 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 37 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 39 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 40 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 41 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 43 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 44 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 45 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#ec09df5b>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#ec09e115>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 70 })>,
<#2e6cf4ea: ({ #d121c0bd: 71 })>,
<#2e6cf4ea: ({ #d121c0bd: 72 })>,
<#2e6cf4ea: ({ #d121c0bd: 73 })>,
<#22d546dd: ({ #d121c0bd: 74 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 77 }, { #c1127ea9: 17 })>,
<#22d546dd: ({ #d121c0bd: 78 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 79 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 80 }, 81)>,
<#d3d219f7: ({ #d121c0bd: 82 }, { #c1127ea9: 14, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 83 }, { #c1127ea9: 19, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 84 }, { #c1127ea9: 19 })>,
<#d80cb60b: ({ #d121c0bd: 85 }, 86)>,
<#da0c5ecf:
({ #d121c0bd: 87 },
{ #cd26765d: { #c1127ea9: 85 }, #11302019: 24 },
1)>,
<#0b08cd60: ({ #d121c0bd: 8 }, { #c1127ea9: 14, #ea1a680e: true })>,
<#0098a8c5: ({ #d121c0bd: 88 }, { #fcd148e8: 74 })>,
<#2e3d736c: ({ #d121c0bd: 89 }, { #c1127ea9: 88 })>,
<#19e1ef85:
({ #d121c0bd: 90, #26f32be5: 89 },
{ #0b680f7d: { #c1127ea9: 89 }, #c3687459: 91 })>,
<#19e1ef85:
({ #d121c0bd: 16, #26f32be5: 89 },
{ #0b680f7d: { #c1127ea9: 90 }, #c3687459: 15 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,242 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#da76a085:
({
#d121c0bd: 7,
#21793419:
({
#c3bbce7c: "tests/namespace_decl.cpp",
#c7b317f4: 7,
#c68b4ed6: 1
},
{ #c7b317f4: 15, #c68b4ed6: 1 })
},
{ #c8ff724b: "Q", #2cdb06fb: [ "Q" ] },
[
<#da76a085:
({
#d121c0bd: 8,
#21793419:
({ #c7b317f4: 8, #c68b4ed6: 1 },
{ #c7b317f4: 9, #c68b4ed6: 1 })
},
{ #c8ff724b: "V", #2cdb06fb: [ "V", "Q" ] },
[],
{ },
{ })>,
<#da76a085:
({
#d121c0bd: 9,
#21793419:
({ #c7b317f4: 10, #c68b4ed6: 1 },
{ #c7b317f4: 11, #c68b4ed6: 1 })
},
{ #c8ff724b: "V", #2cdb06fb: [ "V", "Q" ] },
[],
{ },
{
#caa189ed: {
#c709e154: <#09c0ca7b>,
#ec05e4a8: 8,
#c8ff724b: { #c8ff724b: "V", #2cdb06fb: [ "V", "Q" ] }
}
})>,
<#da76a085:
({
#d121c0bd: 10,
#21793419:
({ #c7b317f4: 12, #c68b4ed6: 1 },
{ #c7b317f4: 14, #c68b4ed6: 1 })
},
{ #c8ff724b: "I", #2cdb06fb: [ "I", "Q" ] },
[
<#11c182d1:
({
#d121c0bd: 11,
#21793419:
({ #c7b317f4: 13, #c68b4ed6: 1 }, { #c68b4ed6: 5 })
},
{ #c8ff724b: "i", #2cdb06fb: [ "i", "Q" ] },
{ #c1127ea9: 12 },
{ #ccd69858: true })>
],
{ },
{ #3e64314e: true })>
],
{ },
{ })>,
<#da76a085:
({
#d121c0bd: 13,
#21793419:
({ #c7b317f4: 17, #c68b4ed6: 1 },
{ #c7b317f4: 19, #c68b4ed6: 1 })
},
{
#c8ff724b: "",
#2cdb06fb: [ "anonymous_namespace_tests/namespace_decl.cpp" ]
},
[],
{ },
{ })>,
<#c7bdbc95:
({
#d121c0bd: 14,
#21793419: ({ #c7b317f4: 17, #c68b4ed6: 11 }, { }),
#eb8a1f5a: true
},
{
#c8ff724b: "<using-directive>",
#2cdb06fb: [ "<using-directive>" ]
},
{
#309827d0: { #c68b4ed6: 11 },
#fa5a1379: { },
#d15fe800: [],
#0781349f: {
#c709e154: <#09c0ca7b>,
#ec05e4a8: 13,
#c8ff724b: {
#c8ff724b: "",
#2cdb06fb: [ "anonymous_namespace_tests/namespace_decl.cpp" ]
}
}
})>,
<#0f3f4d35:
({ #d121c0bd: 15, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
16,
{ })>
],
{ },
{
#e870593a: "tests/namespace_decl.cpp",
#e52854e9: <#1e1941e6>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 17 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 18 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 19 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 20 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 21 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 12 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 22 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 23 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 24 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 25 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 26 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 27 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 28 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 29 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 30 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 31 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 32 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 33 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 34 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 35 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 36 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 37 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 39 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 40 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 41 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 43 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 44 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 45 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#ec09df5b>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#ec09e115>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 70 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 71 })>,
<#2e6cf4ea: ({ #d121c0bd: 72 })>,
<#2e6cf4ea: ({ #d121c0bd: 73 })>,
<#2e6cf4ea: ({ #d121c0bd: 74 })>,
<#22d546dd: ({ #d121c0bd: 75 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 77 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 78 }, { #c1127ea9: 17 })>,
<#22d546dd: ({ #d121c0bd: 79 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 80 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 81 }, 82)>,
<#d3d219f7: ({ #d121c0bd: 83 }, { #c1127ea9: 12, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 84 }, { #c1127ea9: 19, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 85 }, { #c1127ea9: 19 })>,
<#d80cb60b: ({ #d121c0bd: 86 }, 87)>,
<#da0c5ecf:
({ #d121c0bd: 88 },
{ #cd26765d: { #c1127ea9: 86 }, #11302019: 24 },
1)>,
<#0098a8c5: ({ #d121c0bd: 89 }, { #fcd148e8: 75 })>,
<#2e3d736c: ({ #d121c0bd: 90 }, { #c1127ea9: 89 })>,
<#19e1ef85:
({ #d121c0bd: 91, #26f32be5: 90 },
{ #0b680f7d: { #c1127ea9: 90 }, #c3687459: 92 })>,
<#19e1ef85:
({ #d121c0bd: 16, #26f32be5: 90 },
{ #0b680f7d: { #c1127ea9: 91 }, #c3687459: 15 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,285 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#f173dfc2:
({
#d121c0bd: 7,
#21793419:
({
#c3bbce7c: "tests/no_except_expr.cpp",
#c7b317f4: 7,
#c68b4ed6: 1
},
{ #c68b4ed6: 27 }),
#d3368c8a: true
},
{ #c8ff724b: "no_throw", #2cdb06fb: [ "no_throw" ] },
{ #c1127ea9: 8 },
{
#d2e9b40c: "17033017651186285990",
#f1a45f0e: true,
#ebe3c415: 7,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 9,
#21793419: ({ #c68b4ed6: 26 }, { #c68b4ed6: 27 })
},
[])>
})>,
<#21116177:
({
#d121c0bd: 10,
#21793419: ({ #c68b4ed6: 28 }, { #c68b4ed6: 28 })
})>,
<#f173dfc2:
({
#d121c0bd: 11,
#21793419: ({ #c7b317f4: 9, #c68b4ed6: 1 }, { #c68b4ed6: 43 })
},
{ #c8ff724b: "main", #2cdb06fb: [ "main" ] },
{ #c1127ea9: 12 },
{
#f1a45f0e: true,
#ebe3c415: 11,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 13,
#21793419: ({ #c68b4ed6: 12 }, { #c68b4ed6: 43 })
},
[
<#df3bdb38:
({
#d121c0bd: 14,
#21793419: ({ #c68b4ed6: 14 }, { #c68b4ed6: 40 })
},
[
<#c3b129f9:
({
#d121c0bd: 15,
#21793419:
({ #c68b4ed6: 21 }, { #c68b4ed6: 40 })
},
[
<#d1cde112:
({
#d121c0bd: 16,
#21793419:
({ #c68b4ed6: 21 }, { #c68b4ed6: 40 })
},
[
<#c59ea513:
({
#d121c0bd: 17,
#21793419:
({ #c68b4ed6: 30 },
{ #c68b4ed6: 39 })
},
[
<#c3b129f9:
({
#d121c0bd: 18,
#21793419:
({ #c68b4ed6: 30 },
{ #c68b4ed6: 30 })
},
[
<#e9db58be:
({
#d121c0bd: 19,
#21793419:
({ #c68b4ed6: 30 },
{ #c68b4ed6: 30 })
},
[],
{
#30e4876a: {
#c1127ea9: 8
},
#0e89e422:
<#28055b85>
},
{
#c369ebbe: {
#c709e154:
<#ee046738>,
#ec05e4a8: 7,
#c8ff724b: {
#c8ff724b:
"no_throw",
#2cdb06fb: [
"no_throw"
]
},
#30e4876a: {
#c1127ea9: 8
}
}
})>
],
{
#30e4876a: {
#c1127ea9: 20
}
},
{
#c91e0a14: <#210490b0>,
#fa1a3bd3: []
})>
],
{ #30e4876a: { #c1127ea9: 21 } })>
],
{ #30e4876a: { #c1127ea9: 22 } },
{ #31b87f71: true })>
],
{ #30e4876a: { #c1127ea9: 23 } },
{ #c91e0a14: <#2677d46b>, #fa1a3bd3: [] })>
])>
])>
})>,
<#0f3f4d35:
({ #d121c0bd: 24, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
25,
{ })>
],
{ },
{
#e870593a: "tests/no_except_expr.cpp",
#e52854e9: <#1e1941e6>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 21 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 22 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 26 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 27 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 28 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 23 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 29 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 30 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 31 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 32 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 33 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 34 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 35 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 36 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 37 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 39 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 40 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 41 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 43 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 44 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 45 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#ec09df5b>)>,
<#22d546dd: ({ #d121c0bd: 70 }, <#ec09e115>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 72 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 73 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 74 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 77 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 78 })>,
<#2e6cf4ea: ({ #d121c0bd: 79 })>,
<#2e6cf4ea: ({ #d121c0bd: 80 })>,
<#2e6cf4ea: ({ #d121c0bd: 81 })>,
<#22d546dd: ({ #d121c0bd: 82 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 83 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 84 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 85 }, { #c1127ea9: 21 })>,
<#22d546dd: ({ #d121c0bd: 86 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 87 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 88 }, 89)>,
<#d3d219f7: ({ #d121c0bd: 90 }, { #c1127ea9: 23, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 91 }, { #c1127ea9: 26, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 92 }, { #c1127ea9: 26 })>,
<#d80cb60b: ({ #d121c0bd: 93 }, 94)>,
<#da0c5ecf:
({ #d121c0bd: 95 },
{ #cd26765d: { #c1127ea9: 93 }, #11302019: 24 },
1)>,
<#26796f6a:
({ #d121c0bd: 96 }, { #f9c96be9: { #c1127ea9: 21 } }, { })>,
<#26796f6a: ({ #d121c0bd: 8 }, { #f9c96be9: { #c1127ea9: 21 } }, { })>,
<#26796f6a:
({ #d121c0bd: 12 }, { #f9c96be9: { #c1127ea9: 23 } }, { })>,
<#d3d219f7: ({ #d121c0bd: 97 }, { #c1127ea9: 92 })>,
<#d3d219f7: ({ #d121c0bd: 98 }, { #c1127ea9: 96 })>,
<#d3d219f7: ({ #d121c0bd: 20 }, { #c1127ea9: 8 })>,
<#0098a8c5: ({ #d121c0bd: 99 }, { #fcd148e8: 82 })>,
<#2e3d736c: ({ #d121c0bd: 100 }, { #c1127ea9: 99 })>,
<#19e1ef85:
({ #d121c0bd: 101, #26f32be5: 100 },
{ #0b680f7d: { #c1127ea9: 100 }, #c3687459: 102 })>,
<#19e1ef85:
({ #d121c0bd: 25, #26f32be5: 100 },
{ #0b680f7d: { #c1127ea9: 101 }, #c3687459: 24 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,193 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "SEL", #2cdb06fb: [ "SEL" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "id", #2cdb06fb: [ "id" ] },
6,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 7, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "Class", #2cdb06fb: [ "Class" ] },
0,
{ })>,
<#18d25297:
({
#d121c0bd: 8,
#f9005968: 1,
#21793419: ({ }, { }),
#eb8a1f5a: true
},
{ #c8ff724b: "Protocol", #2cdb06fb: [ "Protocol" ] },
[],
{ },
{ })>,
<#0f3f4d35:
({ #d121c0bd: 9, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 10, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 11, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#c589b11c:
({
#d121c0bd: 12,
#21793419:
({
#c3bbce7c: "tests/objcpp_template_unboxing.mm",
#c7b317f4: 7,
#c68b4ed6: 1
},
{ #c7b317f4: 10, #c68b4ed6: 1 })
},
{ #c8ff724b: "box", #2cdb06fb: [ "box" ] },
{ })>,
<#0f3f4d35:
({ #d121c0bd: 13, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
14,
{ })>
],
{ },
{
#e870593a: "tests/objcpp_template_unboxing.mm",
#e52854e9: <#20cf8e89>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 15 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 16 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 17 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 18 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 19 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 20 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 21 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 22 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 23 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 24 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 25 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 26 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 27 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 28 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 29 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 30 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 31 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 32 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 33 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 34 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 35 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 36 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 37 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 39 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 40 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 41 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 43 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 44 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 45 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#ec09df5b>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#ec09e115>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 70 })>,
<#2e6cf4ea: ({ #d121c0bd: 71 })>,
<#2e6cf4ea: ({ #d121c0bd: 72 })>,
<#2e6cf4ea: ({ #d121c0bd: 73 })>,
<#22d546dd: ({ #d121c0bd: 74 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 77 }, { #c1127ea9: 15 })>,
<#22d546dd: ({ #d121c0bd: 78 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 79 }, <#2fe155d3>)>,
<#d3d219f7: ({ #d121c0bd: 80 }, { #c1127ea9: 76 })>,
<#0098a8c5: ({ #d121c0bd: 81 }, { #fcd148e8: 74 })>,
<#2e3d736c: ({ #d121c0bd: 82 }, { #c1127ea9: 81 })>,
<#0098a8c5: ({ #d121c0bd: 83 }, { #fcd148e8: 75 })>,
<#2e3d736c: ({ #d121c0bd: 84 }, { #c1127ea9: 83 })>,
<#2374f4e7: ({ #d121c0bd: 85 }, 8)>,
<#d80cb60b: ({ #d121c0bd: 86 }, 87)>,
<#d3d219f7: ({ #d121c0bd: 88 }, { #c1127ea9: 20, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 89 }, { #c1127ea9: 17, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 90 }, { #c1127ea9: 17 })>,
<#d80cb60b: ({ #d121c0bd: 91 }, 92)>,
<#da0c5ecf:
({ #d121c0bd: 93 },
{ #cd26765d: { #c1127ea9: 91 }, #11302019: 24 },
1)>,
<#f3f3711a: ({ #d121c0bd: 94 })>,
<#f3f3711a: ({ #d121c0bd: 95 })>,
<#26796f6a:
({ #d121c0bd: 96 },
{ #f9c96be9: { #c1127ea9: 77 } },
{ #08ec7593: [ { #c1127ea9: 94 } ] })>,
<#26796f6a:
({ #d121c0bd: 97 },
{ #f9c96be9: { #c1127ea9: 77 } },
{ #08ec7593: [ { #c1127ea9: 95 } ] })>,
<#19e1ef85:
({ #d121c0bd: 6, #26f32be5: 82 },
{ #0b680f7d: { #c1127ea9: 82 }, #c3687459: 5 })>,
<#19e1ef85:
({ #d121c0bd: 14, #26f32be5: 82 },
{ #0b680f7d: { #c1127ea9: 6 }, #c3687459: 13 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,876 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "SEL", #2cdb06fb: [ "SEL" ] },
5,
{ })>,
<#0f3f4d35:
({
#d121c0bd: 6,
#21793419: ({ }, { }),
#eb8a1f5a: true,
#d3368c8a: true
},
{ #c8ff724b: "id", #2cdb06fb: [ "id" ] },
7,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 8, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "Class", #2cdb06fb: [ "Class" ] },
0,
{ })>,
<#18d25297:
({
#d121c0bd: 9,
#f9005968: 1,
#21793419: ({ }, { }),
#eb8a1f5a: true
},
{ #c8ff724b: "Protocol", #2cdb06fb: [ "Protocol" ] },
[],
{ },
{ })>,
<#0f3f4d35:
({ #d121c0bd: 10, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 11, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 12, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#18d25297:
({
#d121c0bd: 13,
#f9005968: 1,
#21793419:
({ #c3bbce7c: "tests/optional.m", #c7b317f4: 8, #c68b4ed6: 1 },
{ #c7b317f4: 9, #c68b4ed6: 2 })
},
{ #c8ff724b: "NSObject", #2cdb06fb: [ "NSObject" ] },
[],
{ },
{ })>,
<#e1b0618e:
({
#d121c0bd: 14,
#f9005968: 1,
#21793419:
({ #c7b317f4: 11, #c68b4ed6: 1 },
{ #c7b317f4: 12, #c68b4ed6: 2 })
},
{ #c8ff724b: "NSObject", #2cdb06fb: [ "NSObject" ] },
[],
{ },
{ })>,
<#e1b0618e:
({
#d121c0bd: 15,
#f9005968: 1,
#21793419:
({ #c7b317f4: 14, #c68b4ed6: 1 },
{ #c7b317f4: 17, #c68b4ed6: 2 })
},
{ #c8ff724b: "BarDelegate", #2cdb06fb: [ "BarDelegate" ] },
[
<#3ccd3797:
({
#d121c0bd: 16,
#f9005968: 15,
#21793419:
({ #c7b317f4: 16, #c68b4ed6: 1 }, { #c68b4ed6: 25 })
},
{
#c8ff724b: "optionalFunction",
#2cdb06fb: [ "optionalFunction", "BarDelegate" ]
},
{
#3ba2c7f6: true,
#137b649c: { #c1127ea9: 17 },
#22b27dd5: true,
#d2e9b40c: "-[BarDelegate optionalFunction]"
})>
],
{ },
{
#d688371b: [
{
#c709e154: <#cd511304>,
#ec05e4a8: 14,
#c8ff724b: {
#c8ff724b: "NSObject",
#2cdb06fb: [ "NSObject" ]
}
}
]
})>,
<#18d25297:
({
#d121c0bd: 18,
#f9005968: 1,
#21793419:
({ #c7b317f4: 19, #c68b4ed6: 1 },
{ #c7b317f4: 21, #c68b4ed6: 2 })
},
{ #c8ff724b: "Bar", #2cdb06fb: [ "Bar" ] },
[
<#c5b2960b:
({
#d121c0bd: 19,
#f9005968: 18,
#21793419:
({ #c7b317f4: 20, #c68b4ed6: 1 }, { #c68b4ed6: 46 })
},
{ #c8ff724b: "delegate", #2cdb06fb: [ "delegate", "Bar" ] },
{
#30e4876a: { #c1127ea9: 20 },
#3106f0d5: {
#c709e154: <#e655f08d>,
#ec05e4a8: 21,
#c8ff724b: {
#c8ff724b: "delegate",
#2cdb06fb: [ "delegate", "Bar" ]
}
},
#f60cd2e1: {
#c709e154: <#e655f08d>,
#ec05e4a8: 22,
#c8ff724b: {
#c8ff724b: "setDelegate:",
#2cdb06fb: [ "setDelegate:", "Bar" ]
}
},
#2e0d396b: {
#c709e154: <#38103cca>,
#ec05e4a8: 23,
#c8ff724b: {
#c8ff724b: "_delegate",
#2cdb06fb: [ "_delegate", "Bar" ]
},
#30e4876a: { #c1127ea9: 20 }
},
#e42793c1: [
<#009aba4f>, <#2fe629a9>, <#cd718b98>, <#374fb956>
]
})>,
<#3ccd3797:
({
#d121c0bd: 21,
#f9005968: 18,
#21793419: ({ #c68b4ed6: 46 }, { #c68b4ed6: 46 }),
#eb8a1f5a: true
},
{ #c8ff724b: "delegate", #2cdb06fb: [ "delegate", "Bar" ] },
{
#3ba2c7f6: true,
#137b649c: { #c1127ea9: 20 },
#001e675c: true,
#2c8fcfd4: {
#c709e154: <#f9260501>,
#ec05e4a8: 19,
#c8ff724b: {
#c8ff724b: "delegate",
#2cdb06fb: [ "delegate", "Bar" ]
}
},
#28dcb2c4: [
<#d0d84992:
({
#d121c0bd: 24,
#21793419: ({ }, { }),
#eb8a1f5a: true
},
{ #c8ff724b: "self", #2cdb06fb: [ "self" ] },
{ #c1127ea9: 25, #ea1a680e: true },
{ })>,
<#d0d84992:
({
#d121c0bd: 26,
#21793419: ({ }, { }),
#eb8a1f5a: true
},
{ #c8ff724b: "_cmd", #2cdb06fb: [ "_cmd" ] },
{ #c1127ea9: 5 },
{ })>
],
#d2e9b40c: "-[Bar delegate]"
})>,
<#3ccd3797:
({
#d121c0bd: 22,
#f9005968: 18,
#21793419: ({ #c68b4ed6: 46 }, { #c68b4ed6: 46 }),
#eb8a1f5a: true
},
{
#c8ff724b: "setDelegate:",
#2cdb06fb: [ "setDelegate:", "Bar" ]
},
{
#3ba2c7f6: true,
#137b649c: { #c1127ea9: 17 },
#001e675c: true,
#2c8fcfd4: {
#c709e154: <#f9260501>,
#ec05e4a8: 19,
#c8ff724b: {
#c8ff724b: "delegate",
#2cdb06fb: [ "delegate", "Bar" ]
}
},
#d17ebeaa: [
<#fd75cc45:
({
#d121c0bd: 27,
#21793419: ({ #c68b4ed6: 46 }, { #c68b4ed6: 46 })
},
{ #c8ff724b: "delegate", #2cdb06fb: [ "delegate" ] },
{ #c1127ea9: 20 },
{ #0370b1b2: 0 })>
],
#28dcb2c4: [
<#d0d84992:
({
#d121c0bd: 28,
#21793419: ({ }, { }),
#eb8a1f5a: true
},
{ #c8ff724b: "self", #2cdb06fb: [ "self" ] },
{ #c1127ea9: 25, #ea1a680e: true },
{ })>,
<#d0d84992:
({
#d121c0bd: 29,
#21793419: ({ }, { }),
#eb8a1f5a: true
},
{ #c8ff724b: "_cmd", #2cdb06fb: [ "_cmd" ] },
{ #c1127ea9: 5 },
{ })>
],
#d2e9b40c: "-[Bar setDelegate:]"
})>
],
{ },
{
#04c0017b: {
#c709e154: <#3cf18b8d>,
#ec05e4a8: 13,
#c8ff724b: { #c8ff724b: "NSObject", #2cdb06fb: [ "NSObject" ] }
},
#d32dd232: {
#c709e154: <#c37c57de>,
#ec05e4a8: 30,
#c8ff724b: { #c8ff724b: "Bar", #2cdb06fb: [ "Bar" ] }
}
})>,
<#0e281b68:
({
#d121c0bd: 30,
#f9005968: 1,
#21793419:
({ #c7b317f4: 23, #c68b4ed6: 1 },
{ #c7b317f4: 28, #c68b4ed6: 1 })
},
{ #c8ff724b: "Bar", #2cdb06fb: [ "Bar" ] },
[
<#3ccd3797:
({
#d121c0bd: 31,
#f9005968: 30,
#21793419:
({ #c7b317f4: 24, #c68b4ed6: 1 },
{ #c7b317f4: 26, #c68b4ed6: 1 })
},
{
#c8ff724b: "unsafeAction",
#2cdb06fb: [ "unsafeAction", "Bar" ]
},
{
#3ba2c7f6: true,
#137b649c: { #c1127ea9: 17 },
#28dcb2c4: [
<#d0d84992:
({
#d121c0bd: 32,
#21793419: ({ }, { }),
#eb8a1f5a: true,
#0a16e1f2: true,
#d3368c8a: true
},
{ #c8ff724b: "self", #2cdb06fb: [ "self" ] },
{ #c1127ea9: 25, #ea1a680e: true },
{ })>,
<#d0d84992:
({
#d121c0bd: 33,
#21793419: ({ }, { }),
#eb8a1f5a: true
},
{ #c8ff724b: "_cmd", #2cdb06fb: [ "_cmd" ] },
{ #c1127ea9: 5 },
{ })>
],
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 34,
#21793419:
({ #c7b317f4: 24, #c68b4ed6: 22 },
{ #c7b317f4: 26, #c68b4ed6: 1 })
},
[
<#d0cddcea:
({
#d121c0bd: 35,
#21793419:
({ #c7b317f4: 25, #c68b4ed6: 3 },
{ #c68b4ed6: 34 })
},
[
<#f104c570:
({
#d121c0bd: 36,
#21793419:
({ #c68b4ed6: 3 }, { #c68b4ed6: 34 })
},
[
<#26afa8d2:
({
#d121c0bd: 37,
#21793419:
({ #c68b4ed6: 4 },
{ #c68b4ed6: 9 })
},
[
<#e9c8dd27:
({
#d121c0bd: 38,
#21793419:
({ #c68b4ed6: 4 },
{ #c68b4ed6: 9 })
},
[
<#0d679c05:
({
#d121c0bd: 39,
#21793419:
({ #c68b4ed6: 4 },
{ #c68b4ed6: 4 })
},
[],
{
#30e4876a: {
#c1127ea9: 25
}
},
{
#12076e59:
<#c3b129f9:
({
#d121c0bd: 40,
#21793419:
({
#c68b4ed6:
4
},
{
#c68b4ed6:
4
})
},
[
<#e9db58be:
({
#d121c0bd:
41,
#21793419:
(
{
#c68b4ed6:
4
},
{
#c68b4ed6:
4
})
},
[],
{
#30e4876a: {
#c1127ea9:
25,
#ea1a680e:
true
},
#0e89e422:
<#28055b85>
},
{
#c369ebbe: {
#c709e154:
<#c6dba908>,
#ec05e4a8:
32,
#c8ff724b: {
#c8ff724b:
"self",
#2cdb06fb: [
"self"
]
},
#30e4876a: {
#c1127ea9:
25,
#ea1a680e:
true
}
}
})>
],
{
#30e4876a: {
#c1127ea9:
25
}
},
{
#c91e0a14:
<#f7495e1f>,
#fa1a3bd3: []
})>
})>
],
{
#30e4876a: {
#c1127ea9: 42
},
#0e89e422: <#28055b85>,
#d61caa14: <#f9260501>
},
{
#c709e154:
<#fac503de: {
#c709e154: <#f9260501>,
#ec05e4a8: 19,
#c8ff724b: {
#c8ff724b:
"delegate",
#2cdb06fb: [
"delegate", "Bar"
]
}
}>,
#2827bd9b: true
})>,
<#0d679c05:
({
#d121c0bd: 39,
#21793419:
({ #c68b4ed6: 4 },
{ #c68b4ed6: 4 })
},
[],
{
#30e4876a: {
#c1127ea9: 25
}
},
{
#12076e59:
<#c3b129f9:
({
#d121c0bd: 40,
#21793419:
({ #c68b4ed6: 4 },
{ #c68b4ed6: 4 })
},
[
<#e9db58be:
({
#d121c0bd: 41,
#21793419:
({
#c68b4ed6:
4
},
{
#c68b4ed6:
4
})
},
[],
{
#30e4876a: {
#c1127ea9:
25,
#ea1a680e:
true
},
#0e89e422:
<#28055b85>
},
{
#c369ebbe: {
#c709e154:
<#c6dba908>,
#ec05e4a8:
32,
#c8ff724b: {
#c8ff724b:
"self",
#2cdb06fb: [
"self"
]
},
#30e4876a: {
#c1127ea9:
25,
#ea1a680e:
true
}
}
})>
],
{
#30e4876a: {
#c1127ea9: 25
}
},
{
#c91e0a14:
<#f7495e1f>,
#fa1a3bd3: []
})>
})>,
<#c3b129f9:
({
#d121c0bd: 43,
#21793419:
({ #c68b4ed6: 9 },
{ #c68b4ed6: 9 })
},
[
<#f104c570:
({
#d121c0bd: 44,
#21793419:
({ #c68b4ed6: 9 },
{ #c68b4ed6: 9 })
},
[
<#0d679c05:
({
#d121c0bd: 39,
#21793419:
({
#c68b4ed6:
4
},
{
#c68b4ed6:
4
})
},
[],
{
#30e4876a: {
#c1127ea9: 25
}
},
{
#12076e59:
<#c3b129f9:
({
#d121c0bd:
40,
#21793419:
(
{
#c68b4ed6:
4
},
{
#c68b4ed6:
4
})
},
[
<#e9db58be:
({
#d121c0bd:
41,
#21793419:
(
{
#c68b4ed6:
4
},
{
#c68b4ed6:
4
})
},
[],
{
#30e4876a: {
#c1127ea9:
25,
#ea1a680e:
true
},
#0e89e422:
<#28055b85>
},
{
#c369ebbe: {
#c709e154:
<#c6dba908>,
#ec05e4a8:
32,
#c8ff724b: {
#c8ff724b:
"self",
#2cdb06fb: [
"self"
]
},
#30e4876a: {
#c1127ea9:
25,
#ea1a680e:
true
}
}
})>
],
{
#30e4876a: {
#c1127ea9:
25
}
},
{
#c91e0a14:
<#f7495e1f>,
#fa1a3bd3:
[]
})>
})>
],
{
#30e4876a: {
#c1127ea9: 20
}
},
{
#316d331f: "delegate",
#ec05e4a8: 21
})>
],
{
#30e4876a: {
#c1127ea9: 20
}
},
{
#c91e0a14: <#e02d4a65>,
#fa1a3bd3: []
})>
],
{ #30e4876a: { #c1127ea9: 20 } })>
],
{ #30e4876a: { #c1127ea9: 17 } },
{
#316d331f: "optionalFunction",
#ec05e4a8: 16
})>
],
{ #30e4876a: { #c1127ea9: 17 } },
{ })>
])>,
#d2e9b40c: "-[Bar unsafeAction]"
})>,
<#070ee654:
({
#d121c0bd: 23,
#f9005968: 30,
#21793419:
({ #c7b317f4: 20, #c68b4ed6: 46 }, { #c68b4ed6: 46 })
},
{ #c8ff724b: "_delegate", #2cdb06fb: [ "_delegate", "Bar" ] },
{ #c1127ea9: 20 },
{ },
{ #015a971f: true, #f9049e82: <#d6c054e3> })>,
<#c1a9158b:
({ #d121c0bd: 45, #21793419: ({ }, { #c68b4ed6: 46 }) },
{
#d32dd232: <#009015ca>,
#2c8fcfd4: {
#c709e154: <#f9260501>,
#ec05e4a8: 19,
#c8ff724b: {
#c8ff724b: "delegate",
#2cdb06fb: [ "delegate", "Bar" ]
}
},
#2e0d396b: {
#c709e154: <#38103cca>,
#ec05e4a8: 23,
#c8ff724b: {
#c8ff724b: "_delegate",
#2cdb06fb: [ "_delegate", "Bar" ]
},
#30e4876a: { #c1127ea9: 20 }
}
})>
],
{ },
{
#2ec29bb2: {
#c709e154: <#3cf18b8d>,
#ec05e4a8: 18,
#c8ff724b: { #c8ff724b: "Bar", #2cdb06fb: [ "Bar" ] }
}
})>,
<#0f3f4d35:
({ #d121c0bd: 46, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
47,
{ })>
],
{ },
{
#e870593a: "tests/optional.m",
#e52854e9: <#3ff69d49>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 17 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 70 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 72 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 73 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 74 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 77 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 78 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 79 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 80 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 81 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 82 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 83 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 84 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 85 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 86 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 87 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 88 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 89 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 90 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 91 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 92 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 93 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 94 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 95 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 96 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 97 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 98 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 99 })>,
<#2e6cf4ea: ({ #d121c0bd: 100 })>,
<#2e6cf4ea: ({ #d121c0bd: 101 })>,
<#2e6cf4ea: ({ #d121c0bd: 102 })>,
<#22d546dd: ({ #d121c0bd: 103 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 104 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 105 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 106 }, { #c1127ea9: 17 })>,
<#22d546dd: ({ #d121c0bd: 107 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 108 }, <#2fe155d3>)>,
<#d3d219f7: ({ #d121c0bd: 109 }, { #c1127ea9: 105 })>,
<#0098a8c5: ({ #d121c0bd: 110 }, { #fcd148e8: 103 })>,
<#2e3d736c: ({ #d121c0bd: 111 }, { #c1127ea9: 110 })>,
<#0098a8c5: ({ #d121c0bd: 112 }, { #fcd148e8: 104 })>,
<#2e3d736c: ({ #d121c0bd: 113 }, { #c1127ea9: 112 })>,
<#2374f4e7: ({ #d121c0bd: 114 }, 9)>,
<#d80cb60b: ({ #d121c0bd: 115 }, 116)>,
<#d3d219f7: ({ #d121c0bd: 117 }, { #c1127ea9: 52, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 118 }, { #c1127ea9: 49, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 119 }, { #c1127ea9: 49 })>,
<#d80cb60b: ({ #d121c0bd: 120 }, 121)>,
<#da0c5ecf:
({ #d121c0bd: 122 },
{ #cd26765d: { #c1127ea9: 120 }, #11302019: 24 },
1)>,
<#2374f4e7: ({ #d121c0bd: 123 }, 13)>,
<#19e1ef85:
({ #d121c0bd: 7, #26f32be5: 111 },
{ #0b680f7d: { #c1127ea9: 111 }, #c3687459: 6 })>,
<#19e1ef85:
({ #d121c0bd: 47, #26f32be5: 111 },
{ #0b680f7d: { #c1127ea9: 7 }, #c3687459: 46 })>,
<#2374f4e7: ({ #d121c0bd: 124 }, 18)>,
<#0098a8c5:
({ #d121c0bd: 125 }, { #fcd148e8: 103, #0b037c51: [ 15 ] })>,
<#2e3d736c: ({ #d121c0bd: 20 }, { #c1127ea9: 125 })>,
<#2e3d736c: ({ #d121c0bd: 25 }, { #c1127ea9: 124 })>,
<#19e1ef85:
({ #d121c0bd: 5, #26f32be5: 109 },
{ #0b680f7d: { #c1127ea9: 109 }, #c3687459: 4 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

@ -0,0 +1,314 @@
<#032016ff:
({ #d121c0bd: 1, #21793419: ({ }, { }) },
[
<#0f3f4d35:
({ #d121c0bd: 2, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__int128_t", #2cdb06fb: [ "__int128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 3, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "__uint128_t", #2cdb06fb: [ "__uint128_t" ] },
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 4, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__NSConstantString",
#2cdb06fb: [ "__NSConstantString" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 5, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_ms_va_list",
#2cdb06fb: [ "__builtin_ms_va_list" ]
},
0,
{ })>,
<#0f3f4d35:
({ #d121c0bd: 6, #21793419: ({ }, { }), #eb8a1f5a: true },
{
#c8ff724b: "__builtin_va_list",
#2cdb06fb: [ "__builtin_va_list" ]
},
0,
{ })>,
<#37b901fc:
({
#d121c0bd: 7,
#21793419:
({
#c3bbce7c: "tests/sizeof_static_evaluation.cpp",
#c7b317f4: 7,
#c68b4ed6: 1
},
{ #c7b317f4: 8, #c68b4ed6: 7 })
},
{ #c8ff724b: "__foo", #2cdb06fb: [ "__foo" ] },
{ })>,
<#2339e324:
({
#d121c0bd: 8,
#f9005968: 1,
#21793419:
({ #c7b317f4: 10, #c68b4ed6: 1 },
{ #c7b317f4: 16, #c68b4ed6: 1 })
},
{
#c8ff724b: "__foo",
#2cdb06fb: [ "__foo<type-parameter-0-0, true>" ]
},
9,
[
<#f50d797e:
({
#d121c0bd: 10,
#f9005968: 8,
#21793419:
({ #c7b317f4: 11, #c68b4ed6: 1 }, { #c68b4ed6: 7 }),
#eb8a1f5a: true,
#d3368c8a: true,
#0b0695a4: <#1b87f4c9>
},
{
#c8ff724b: "__foo",
#2cdb06fb: [ "__foo", "__foo<type-parameter-0-0, true>" ]
},
9,
[],
{ },
<#01fae064>,
{ #33244202: 0, #fd16bc2f: true },
{ })>,
<#fb87d624:
({
#d121c0bd: 11,
#f9005968: 8,
#21793419:
({ #c7b317f4: 12, #c68b4ed6: 3 }, { #c68b4ed6: 19 }),
#0b0695a4: <#d6c054e3>
},
{
#c8ff724b: "x",
#2cdb06fb: [ "x", "__foo<type-parameter-0-0, true>" ]
},
{ #c1127ea9: 12 },
{
#fe93c404:
<#c3b129f9:
({
#d121c0bd: 13,
#21793419: ({ #c68b4ed6: 11 }, { #c68b4ed6: 19 })
},
[
<#ea792ce2:
({
#d121c0bd: 14,
#21793419:
({ #c68b4ed6: 11 }, { #c68b4ed6: 19 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#c709e154: <#f5a2cc58>,
#30e4876a: { #c1127ea9: 16 }
})>
],
{ #30e4876a: { #c1127ea9: 12 } },
{ #c91e0a14: <#2677d46b>, #fa1a3bd3: [] })>
})>,
<#1cd5be29:
({
#d121c0bd: 17,
#21793419:
({ #c7b317f4: 14, #c68b4ed6: 2 }, { #c68b4ed6: 8 }),
#0b0695a4: <#1b87f4c9>
})>,
<#cc498dc1:
({
#d121c0bd: 18,
#f9005968: 8,
#21793419:
({ #c7b317f4: 15, #c68b4ed6: 3 }, { #c68b4ed6: 11 }),
#0b0695a4: <#1b87f4c9>
},
{
#c8ff724b: "__foo<type-parameter-0-0, true>",
#2cdb06fb: [
"__foo<type-parameter-0-0, true>",
"__foo<type-parameter-0-0, true>"
]
},
{ #c1127ea9: 19 },
{
#d2e9b40c: "800005863435481739",
#f1a45f0e: true,
#ebe3c415: 18,
#c11b7aa2:
<#d394bb73:
({
#d121c0bd: 20,
#21793419: ({ #c68b4ed6: 10 }, { #c68b4ed6: 11 })
},
[])>
},
{ })>
],
{ },
<#01fae064>,
{ #33244202: 8, #1a9a7e84: true, #fd16bc2f: true },
{ },
"2204753185921246810",
{
#e43971cf: 7,
#0de52551: [ <#37e21eda: { #c1127ea9: 21 }>, <#fae5d38c: "1"> ]
})>,
<#11c182d1:
({
#d121c0bd: 22,
#21793419: ({ #c7b317f4: 18, #c68b4ed6: 1 }, { #c68b4ed6: 20 })
},
{ #c8ff724b: "y", #2cdb06fb: [ "y" ] },
{ #c1127ea9: 12 },
{
#ccd69858: true,
#fe93c404:
<#c3b129f9:
({
#d121c0bd: 23,
#21793419: ({ #c68b4ed6: 9 }, { #c68b4ed6: 20 })
},
[
<#ea792ce2:
({
#d121c0bd: 24,
#21793419: ({ #c68b4ed6: 9 }, { #c68b4ed6: 20 })
},
[],
{ #30e4876a: { #c1127ea9: 15 } },
{
#c709e154: <#c2fc5e5f: 1>,
#30e4876a: { #c1127ea9: 25 }
})>
],
{ #30e4876a: { #c1127ea9: 12 } },
{ #c91e0a14: <#2677d46b>, #fa1a3bd3: [] })>
})>,
<#0f3f4d35:
({ #d121c0bd: 26, #21793419: ({ }, { }), #eb8a1f5a: true },
{ #c8ff724b: "instancetype", #2cdb06fb: [ "instancetype" ] },
27,
{ })>
],
{ },
{
#e870593a: "tests/sizeof_static_evaluation.cpp",
#e52854e9: <#1e1941e6>,
#f81dea91: {
#26452803: 8,
#c674c89d: 16,
#3569bf4a: 32,
#d7cd079d: 64,
#048ad2a1: 64
},
#1acb7079: [
<#22d546dd: ({ #d121c0bd: 28 }, <#392cef74>)>,
<#22d546dd: ({ #d121c0bd: 29 }, <#2bf4b04a>)>,
<#22d546dd: ({ #d121c0bd: 25 }, <#ec0a078a>)>,
<#22d546dd: ({ #d121c0bd: 30 }, <#f6dab0c9>)>,
<#22d546dd: ({ #d121c0bd: 31 }, <#0f54f45c>)>,
<#22d546dd: ({ #d121c0bd: 12 }, <#0037c4cf>)>,
<#22d546dd: ({ #d121c0bd: 32 }, <#3290d19c>)>,
<#22d546dd: ({ #d121c0bd: 33 }, <#fee0a138>)>,
<#22d546dd: ({ #d121c0bd: 34 }, <#1da7d9cb>)>,
<#22d546dd: ({ #d121c0bd: 35 }, <#0baa9fe7>)>,
<#22d546dd: ({ #d121c0bd: 36 }, <#3866e79a>)>,
<#22d546dd: ({ #d121c0bd: 15 }, <#23a02071>)>,
<#22d546dd: ({ #d121c0bd: 37 }, <#09087e8d>)>,
<#22d546dd: ({ #d121c0bd: 38 }, <#15c4357c>)>,
<#22d546dd: ({ #d121c0bd: 39 }, <#e75f9f31>)>,
<#22d546dd: ({ #d121c0bd: 40 }, <#c2f78dcd>)>,
<#22d546dd: ({ #d121c0bd: 41 }, <#3726ba3b>)>,
<#22d546dd: ({ #d121c0bd: 42 }, <#3759b761>)>,
<#22d546dd: ({ #d121c0bd: 43 }, <#ebd317dd>)>,
<#22d546dd: ({ #d121c0bd: 44 }, <#2ec759b9>)>,
<#22d546dd: ({ #d121c0bd: 45 }, <#284d329d>)>,
<#22d546dd: ({ #d121c0bd: 46 }, <#35acb472>)>,
<#22d546dd: ({ #d121c0bd: 47 }, <#2b1d0544>)>,
<#22d546dd: ({ #d121c0bd: 48 }, <#0106ffa8>)>,
<#22d546dd: ({ #d121c0bd: 49 }, <#d6bc9d8a>)>,
<#22d546dd: ({ #d121c0bd: 50 }, <#19b0df66>)>,
<#22d546dd: ({ #d121c0bd: 51 }, <#1336b84a>)>,
<#22d546dd: ({ #d121c0bd: 52 }, <#20963a1f>)>,
<#22d546dd: ({ #d121c0bd: 53 }, <#16068af1>)>,
<#22d546dd: ({ #d121c0bd: 54 }, <#ebf08555>)>,
<#22d546dd: ({ #d121c0bd: 55 }, <#d78ceb63>)>,
<#22d546dd: ({ #d121c0bd: 56 }, <#dd2a33f3>)>,
<#22d546dd: ({ #d121c0bd: 57 }, <#ef62b1d7>)>,
<#22d546dd: ({ #d121c0bd: 58 }, <#0c8bf62c>)>,
<#22d546dd: ({ #d121c0bd: 59 }, <#13391dca>)>,
<#22d546dd: ({ #d121c0bd: 60 }, <#ecc0d32e>)>,
<#22d546dd: ({ #d121c0bd: 61 }, <#c2767110>)>,
<#22d546dd: ({ #d121c0bd: 62 }, <#c813b9a0>)>,
<#22d546dd: ({ #d121c0bd: 63 }, <#da4c3784>)>,
<#22d546dd: ({ #d121c0bd: 64 }, <#f7757bd9>)>,
<#22d546dd: ({ #d121c0bd: 65 }, <#fe22a377>)>,
<#22d546dd: ({ #d121c0bd: 66 }, <#d7aa58db>)>,
<#22d546dd: ({ #d121c0bd: 67 }, <#d2f340c8>)>,
<#22d546dd: ({ #d121c0bd: 68 }, <#2193aedd>)>,
<#22d546dd: ({ #d121c0bd: 69 }, <#0dd56321>)>,
<#22d546dd: ({ #d121c0bd: 70 }, <#d8e10c82>)>,
<#22d546dd: ({ #d121c0bd: 71 }, <#ec09df5b>)>,
<#22d546dd: ({ #d121c0bd: 72 }, <#ec09e115>)>,
<#22d546dd: ({ #d121c0bd: 73 }, <#c4f079df>)>,
<#22d546dd: ({ #d121c0bd: 74 }, <#1ee7219a>)>,
<#22d546dd: ({ #d121c0bd: 75 }, <#0d506118>)>,
<#22d546dd: ({ #d121c0bd: 76 }, <#dec9bcfd>)>,
<#22d546dd: ({ #d121c0bd: 77 }, <#f1f6e5a2>)>,
<#22d546dd: ({ #d121c0bd: 78 }, <#d935d0cf>)>,
<#22d546dd: ({ #d121c0bd: 79 }, <#d35a4eab>)>,
<#2e6cf4ea: ({ #d121c0bd: 80 })>,
<#2e6cf4ea: ({ #d121c0bd: 81 })>,
<#2e6cf4ea: ({ #d121c0bd: 82 })>,
<#2e6cf4ea: ({ #d121c0bd: 83 })>,
<#22d546dd: ({ #d121c0bd: 84 }, <#c9ba0f87>)>,
<#22d546dd: ({ #d121c0bd: 85 }, <#db21580c>)>,
<#22d546dd: ({ #d121c0bd: 86 }, <#391b1e6e>)>,
<#d3d219f7: ({ #d121c0bd: 87 }, { #c1127ea9: 28 })>,
<#22d546dd: ({ #d121c0bd: 88 }, <#ea323187>)>,
<#22d546dd: ({ #d121c0bd: 89 }, <#2fe155d3>)>,
<#d80cb60b: ({ #d121c0bd: 90 }, 91)>,
<#d3d219f7: ({ #d121c0bd: 92 }, { #c1127ea9: 12, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 93 }, { #c1127ea9: 25, #ea1a680e: true })>,
<#d3d219f7: ({ #d121c0bd: 94 }, { #c1127ea9: 25 })>,
<#d80cb60b: ({ #d121c0bd: 95 }, 96)>,
<#da0c5ecf:
({ #d121c0bd: 97 },
{ #cd26765d: { #c1127ea9: 95 }, #11302019: 24 },
1)>,
<#f3f3711a: ({ #d121c0bd: 21 })>,
<#f3f3711a: ({ #d121c0bd: 98 })>,
<#ece2635f: ({ #d121c0bd: 99 })>,
<#ece2635f: ({ #d121c0bd: 100 })>,
<#d49f978d: ({ #d121c0bd: 101 })>,
<#f3f3711a: ({ #d121c0bd: 16 })>,
<#ece2635f: ({ #d121c0bd: 102 })>,
<#ece2635f: ({ #d121c0bd: 103 })>,
<#d49f978d: ({ #d121c0bd: 9 })>,
<#ece2635f: ({ #d121c0bd: 104 })>,
<#d3d219f7: ({ #d121c0bd: 105 }, { #c1127ea9: 9 })>,
<#26796f6a:
({ #d121c0bd: 19 }, { #f9c96be9: { #c1127ea9: 28 } }, { })>,
<#0098a8c5: ({ #d121c0bd: 106 }, { #fcd148e8: 84 })>,
<#2e3d736c: ({ #d121c0bd: 107 }, { #c1127ea9: 106 })>,
<#19e1ef85:
({ #d121c0bd: 108, #26f32be5: 107 },
{ #0b680f7d: { #c1127ea9: 107 }, #c3687459: 109 })>,
<#19e1ef85:
({ #d121c0bd: 27, #26f32be5: 107 },
{ #0b680f7d: { #c1127ea9: 108 }, #c3687459: 26 })>,
<#cfc9a9b2: ({ #d121c0bd: 0 })>
]
})>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save