From 708f4980a90e2a254d7863f875888e9f5c6db0b3 Mon Sep 17 00:00:00 2001 From: Coccinelle Date: Sun, 3 Oct 2010 13:57:53 +0200 Subject: [PATCH] Release coccinelle-0.1.8 ** Features: - Metavariables now capture the cpp code contained within their definitions - When - fragments are separated by ... or nest boundaries in the semantic patch, but end up matching adjacent source code, the comments, cpp code and whitespace that are between them are not deleted. - better parsing of C: do expansion of macros only when needed when have actually a parse error and also leverage the definition of macros in the parsed file (or in a optional_standard.h file passed as a parameter). This should reduce the need for many hardcoded definitions in standard.h - new semantics for the -macro_file option, by default now expand macros only when necessary. To force use the -macro_file_builtins option instead. - a new -extract_macros command line action to help the parser. Works with the -macro_file option. e.g. $ ./spatch -extract_macros ~/linux > /tmp/alldefs.h $ ./spatch -macro_file /tmp/alldefs.h -sp_file foo.cocci -dir ~/linux - removed -D macro_file option, not consistent with what -D usually means - reattempt to be more efficient for statement metavariables that are just placeholders (ie, no modification, no reuse) - triples now returned from ctl in sorted order. The main key is the state. On the other hand, the state order does not always agree with the order of appearance in the code. - spatch is now less verbose on the things it does yet handle. Less confusing for new users. - slightly better error report. Thanks to Derek Jones for the suggestion. - added the options -linux_spacing and -smpl_spacing. -linux_spacing causes spatch to follow the spacing conventions of Linux, while -smpl_spacing causes spatch to follow the spacing in the semantic patch. -linux_spacing is the default. - more informative error reporting for the already tagged token case. Thanks to Erik Hovland for the suggestion. ** Bugfix: - better parsing of declare macro at toplevel and in structure. cf -text xfield - allowing back typedef names for fieldname - better printing of else in generated code - slightly better type inference for binary operators. - clear out declarer names and iterator names between SmPL files (for -testall) - better parsing and type checking of macro type aliases. Cf -test macro_int16. Thanks to Li Yingtong for pointing out the problem. - make insert_virtual_positions tail rec, avoid stack overflow pb. Thanks to Diego Liziero for pointing out the problem. - Better type inference for arithmetic binary operators Thanks to Li Yingtong for pointing out the problem. - Better type inference for constants Thanks to Li Yingtong for pointing out the problem. - move computing of adjacency information for semantic patches to after application of isomorphisms, because isomorphisms can introduce "..." - compute adjacency information for negated ... - record with each transformation site the set of indices of the witness trees that caused the transformation site to come about. Whitespace and comments between remove tokens associated with disjoint witness trees is not removed. - correct treatment of function pointer typed parameters in the SmPL ast0 visitor. - better parsing error message and error recovery when comments are not ended, when some macros have a weird body, and when some switch have a weird Body. Thanks to Derek Jones for pointing out the problem. - better detection and passing of "dangerous" ifdefs, cf -test double_switch. - dropped the separation of decls and body in Seq. This gives better positioning of the bindings of metavariables shared between them. Thanks to Erik Hovland for an example that shows the problem. ** Internals: - supress warning in compiling ocamlsexp (warning caused by a new behavior of cpp used internally in processing files in ocamlsexp/) --- Makefile | 74 +- authors.txt | 15 +- changes.txt | 79 + cocci.ml | 86 +- commitmsg | 111 +- commons/Makefile | 4 +- commons/common.ml | 191 +- commons/common.mli | 22 +- commons/glimpse.ml | 8 +- configure | 27 +- ctl/ctl_engine.ml | 3 +- demos/python_regexp.c | 8 + demos/python_regexp.cocci | 33 + docs/Makefile | 27 +- docs/grammar/Makefile | 61 - docs/manual.tex | 257 -- docs/manual/Makefile | 164 + docs/manual/advanced.tex | 1 + docs/{ => manual}/cocci-python.txt | 0 docs/{grammar => manual}/cocci_syntax.pdf | Bin 272985 -> 272988 bytes docs/{grammar => manual}/cocci_syntax.tex | 108 +- docs/manual/copyright.txt | 7 + docs/{grammar => manual}/examples.tex | 0 docs/manual/installing.tex | 16 + docs/manual/introduction.tex | 59 + docs/manual/isomorphisms.tex | 2 + docs/manual/license.txt | 451 +++ docs/manual/macros.tex | 7 + docs/manual/macros_common.tex | 65 + .../grammar.tex => manual/macros_grammar.tex} | 0 docs/manual/macros_listing_cocci.tex | 45 + docs/manual/macros_options.tex | 6 + docs/manual/main.tex | 202 + docs/manual/main_grammar.tex | 45 + docs/manual/main_options.tex | 21 + docs/manual/manual.pdf | Bin 0 -> 350573 bytes docs/manual/options.pdf | Bin 0 -> 93633 bytes docs/manual/parsing.tex | 1 + .../spatch_options.tex} | 97 +- docs/{grammar => manual}/tips.tex | 0 docs/manual/tutorial.tex | 2 + docs/manual/workflow.tex | 4 + docs/options.pdf | Bin 91014 -> 0 bytes docs/spatch.1 | 1 + engine/asttoctl2.ml | 159 +- engine/asttomember.ml | 16 +- engine/c_vs_c.ml | 11 +- engine/cocci_vs_c.ml | 56 +- engine/ctlcocci_integration.ml | 29 +- engine/ctlcocci_integration.mli | 4 +- engine/flag_matcher.ml | 6 + engine/lib_engine.ml | 3 + engine/pattern_c.ml | 4 +- engine/postprocess_transinfo.ml | 22 +- engine/postprocess_transinfo.mli | 8 +- engine/sgrep.ml | 11 +- engine/transformation_c.ml | 113 +- engine/transformation_c.mli | 2 +- flag_cocci.ml | 4 +- globals/config.ml.in | 2 +- install.txt | 24 +- main.ml | 420 +- menhirlib/Makefile | 2 +- ocamlsexp/Makefile | 8 +- parsing_c/Makefile | 16 +- parsing_c/ast_c.ml | 215 +- parsing_c/comment_annotater_c.ml | 2 + parsing_c/compare_c.ml | 2 +- parsing_c/control_flow_c.ml | 32 +- ...ast_to_flow.ml => control_flow_c_build.ml} | 164 +- ...t_to_flow.mli => control_flow_c_build.mli} | 1 + parsing_c/cpp_ast_c.ml | 17 +- parsing_c/cpp_token_c.ml | 639 +++ parsing_c/cpp_token_c.mli | 46 + parsing_c/flag_parsing_c.ml | 81 +- parsing_c/lexer_c.mll | 97 +- parsing_c/lexer_parser.ml | 4 +- parsing_c/lib_parsing_c.ml | 30 +- parsing_c/parse_c.ml | 469 ++- parsing_c/parse_c.mli | 25 +- parsing_c/parser_c.mly | 255 +- parsing_c/parsing_hacks.ml | 1070 +----- parsing_c/parsing_hacks.mli | 45 +- parsing_c/pretty_print_c.ml | 171 +- parsing_c/pretty_print_c.mli | 1 + parsing_c/test_parsing_c.ml | 129 +- parsing_c/token_c.ml | 4 +- parsing_c/token_helpers.ml | 9 +- parsing_c/token_helpers.mli | 2 + parsing_c/token_views_c.ml | 500 +++ parsing_c/token_views_c.mli | 62 + parsing_c/type_annoter_c.ml | 96 +- parsing_c/type_c.ml | 106 +- parsing_c/type_c.mli | 2 +- parsing_c/unparse_c.ml | 148 +- parsing_c/unparse_cocci.ml | 370 +- parsing_c/unparse_cocci.mli | 9 +- parsing_c/unparse_hrule.ml | 7 +- parsing_c/visitor_c.ml | 77 +- parsing_cocci/.depend | 9 +- parsing_cocci/Makefile | 4 +- parsing_cocci/adjacency.ml | 32 + parsing_cocci/adjacency.mli | 1 + parsing_cocci/adjust_pragmas.ml | 8 +- parsing_cocci/arity.ml | 4 +- parsing_cocci/ast0_cocci.ml | 27 +- parsing_cocci/ast0_cocci.mli | 5 +- parsing_cocci/ast0toast.ml | 54 +- parsing_cocci/ast_cocci.ml | 12 +- parsing_cocci/ast_cocci.mli | 7 +- parsing_cocci/check_meta.ml | 6 +- parsing_cocci/compute_lines.ml | 10 +- parsing_cocci/context_neg.ml | 14 +- parsing_cocci/free_vars.ml | 2 +- parsing_cocci/function_prototypes.ml | 19 +- parsing_cocci/get_constants.ml | 6 +- parsing_cocci/get_constants2.ml | 4 +- parsing_cocci/insert_plus.ml | 8 +- parsing_cocci/iso_pattern.ml | 22 +- parsing_cocci/lexer_cocci.mll | 19 +- parsing_cocci/parse_aux.ml | 18 +- parsing_cocci/parse_cocci.ml | 16 +- parsing_cocci/parser_cocci_menhir.ml | 3413 +++++++++-------- parsing_cocci/parser_cocci_menhir.mli | 2 +- parsing_cocci/parser_cocci_menhir.mly | 16 +- parsing_cocci/pretty_print_cocci.ml | 10 +- parsing_cocci/single_statement.ml | 2 +- parsing_cocci/unify_ast.ml | 13 +- parsing_cocci/unitary_ast0.ml | 2 +- parsing_cocci/unparse_ast0.ml | 20 +- parsing_cocci/visitor_ast.ml | 16 +- parsing_cocci/visitor_ast0.ml | 8 +- python/no_pycocci_aux.ml | 4 +- readme.txt | 26 +- standard.h | 127 +- standard.iso | 6 + testing.ml | 42 +- testing.mli | 2 +- tests/SCORE_expected.sexp | 58 +- tests/SCORE_expected.sexp.save | 151 + tests/SCORE_expected_orig.sexp | 147 + tests/a_and_e.cocci | 2 +- tests/addif.cocci | 2 +- tests/addif2.cocci | 2 +- tests/anon.cocci | 2 +- tests/argument.cocci | 2 +- tests/array_init.cocci | 1 + tests/badzero.c | 10 + tests/badzero.cocci | 26 + tests/badzero.res | 10 + tests/ben.cocci | 2 +- tests/cards.cocci | 1 + tests/cast_iso.cocci | 2 +- tests/check_order1.c | 7 + tests/check_order1.cocci | 11 + tests/check_order2.c | 17 + tests/check_order2.cocci | 17 + tests/constx.cocci | 2 +- tests/cs_check.cocci | 2 +- tests/dropf.cocci | 2 +- tests/find_long.c | 10 + tests/find_long.cocci | 11 + tests/find_long.res | 10 + tests/fun.cocci | 2 +- tests/hd.cocci | 2 +- tests/headers.cocci | 4 +- tests/ifdef4.cocci | 2 +- tests/ifdef5.cocci | 2 +- tests/ifdefmeta.c | 49 + tests/ifdefmeta.cocci | 7 + tests/ifdefmeta.res | 42 + tests/ifdefmeta1.c | 17 + tests/ifdefmeta1.cocci | 3 + tests/ifdefmeta1.res | 2 + tests/ifdefmeta2.c | 12 + tests/ifdefmeta2.cocci | 3 + tests/ifdefmeta2.res | 2 + tests/ifdefmeta3.c | 11 + tests/ifdefmeta3.cocci | 8 + tests/ifdefmeta3.res | 5 + tests/ifdefmeta4.res | 3 + tests/ifelse.c | 52 + tests/ifelse.cocci | 93 + tests/km.cocci | 2 +- tests/km.res | 1 - tests/kmalloc.cocci | 2 +- tests/ktype.cocci | 2 +- tests/ldecl.c | 5 + tests/ldecl.cocci | 7 + tests/longconst.c | 19 + tests/longconst.cocci | 31 + tests/longconst.res | 19 + tests/macro_int16.c | 9 + tests/macro_int16.cocci | 5 + tests/macro_int16.res | 9 + tests/metaruleelem.cocci | 2 +- tests/multitype.cocci | 2 +- tests/neststruct.cocci | 2 +- tests/oddifdef.c | 44 + tests/oddifdef.cocci | 6 + tests/oddifdef.res | 44 + tests/parse_field.c | 4 + tests/parsing_pad.c | 14 + tests/parsing_pad.cocci | 8 + tests/protoassert.cocci | 2 +- tests/rcu3.cocci | 2 +- tests/slow.c | 57 + tests/stm8.cocci | 2 +- tests/struct_typedef.cocci | 2 +- tests/test1.cocci | 2 +- tests/test10.cocci | 2 +- tests/test11.cocci | 2 +- tests/test12.cocci | 2 +- tests/test3.cocci | 2 +- tests/test6.cocci | 2 +- tests/test7.cocci | 4 +- tests/test9.cocci | 2 +- tests/top.cocci | 1 + tests/toplevel_macrostmt.cocci | 8 +- tests/whitespace.cocci | 2 +- tests/xfield.c | 10 + tests/xfield.cocci | 7 + tests/xfield.res | 10 + 223 files changed, 8478 insertions(+), 4841 deletions(-) rewrite commitmsg (97%) create mode 100644 demos/python_regexp.c create mode 100644 demos/python_regexp.cocci delete mode 100644 docs/grammar/Makefile delete mode 100644 docs/manual.tex create mode 100644 docs/manual/Makefile create mode 100644 docs/manual/advanced.tex rename docs/{ => manual}/cocci-python.txt (100%) rename docs/{grammar => manual}/cocci_syntax.pdf (92%) rename docs/{grammar => manual}/cocci_syntax.tex (90%) create mode 100644 docs/manual/copyright.txt rename docs/{grammar => manual}/examples.tex (100%) create mode 100644 docs/manual/installing.tex create mode 100644 docs/manual/introduction.tex create mode 100644 docs/manual/isomorphisms.tex create mode 100644 docs/manual/license.txt create mode 100644 docs/manual/macros.tex create mode 100644 docs/manual/macros_common.tex rename docs/{grammar/grammar.tex => manual/macros_grammar.tex} (100%) create mode 100644 docs/manual/macros_listing_cocci.tex create mode 100644 docs/manual/macros_options.tex create mode 100644 docs/manual/main.tex create mode 100644 docs/manual/main_grammar.tex create mode 100644 docs/manual/main_options.tex create mode 100644 docs/manual/manual.pdf create mode 100644 docs/manual/options.pdf create mode 100644 docs/manual/parsing.tex rename docs/{options.tex => manual/spatch_options.tex} (87%) rename docs/{grammar => manual}/tips.tex (100%) create mode 100644 docs/manual/tutorial.tex create mode 100644 docs/manual/workflow.tex delete mode 100644 docs/options.pdf rename parsing_c/{ast_to_flow.ml => control_flow_c_build.ml} (91%) rename parsing_c/{ast_to_flow.mli => control_flow_c_build.mli} (94%) create mode 100644 parsing_c/cpp_token_c.ml create mode 100644 parsing_c/cpp_token_c.mli create mode 100644 parsing_c/token_views_c.ml create mode 100644 parsing_c/token_views_c.mli create mode 100644 parsing_cocci/adjacency.ml create mode 100644 parsing_cocci/adjacency.mli create mode 100644 tests/SCORE_expected.sexp.save create mode 100644 tests/SCORE_expected_orig.sexp create mode 100644 tests/badzero.c create mode 100644 tests/badzero.cocci create mode 100644 tests/badzero.res create mode 100644 tests/check_order1.c create mode 100644 tests/check_order1.cocci create mode 100644 tests/check_order2.c create mode 100644 tests/check_order2.cocci create mode 100644 tests/find_long.c create mode 100644 tests/find_long.cocci create mode 100644 tests/find_long.res create mode 100644 tests/ifdefmeta.c create mode 100644 tests/ifdefmeta.cocci create mode 100644 tests/ifdefmeta.res create mode 100644 tests/ifdefmeta1.c create mode 100644 tests/ifdefmeta1.cocci create mode 100644 tests/ifdefmeta1.res create mode 100644 tests/ifdefmeta2.c create mode 100644 tests/ifdefmeta2.cocci create mode 100644 tests/ifdefmeta2.res create mode 100644 tests/ifdefmeta3.c create mode 100644 tests/ifdefmeta3.cocci create mode 100644 tests/ifdefmeta3.res create mode 100644 tests/ifdefmeta4.res create mode 100644 tests/ifelse.c create mode 100644 tests/ifelse.cocci create mode 100644 tests/ldecl.c create mode 100644 tests/ldecl.cocci create mode 100644 tests/longconst.c create mode 100644 tests/longconst.cocci create mode 100644 tests/longconst.res create mode 100644 tests/macro_int16.c create mode 100644 tests/macro_int16.cocci create mode 100644 tests/macro_int16.res create mode 100644 tests/oddifdef.c create mode 100644 tests/oddifdef.cocci create mode 100644 tests/oddifdef.res create mode 100644 tests/parse_field.c create mode 100644 tests/parsing_pad.c create mode 100644 tests/parsing_pad.cocci create mode 100644 tests/slow.c create mode 100644 tests/xfield.c create mode 100644 tests/xfield.cocci create mode 100644 tests/xfield.res diff --git a/Makefile b/Makefile index 2a49292..78923d7 100644 --- a/Makefile +++ b/Makefile @@ -85,6 +85,9 @@ OCAMLCFLAGS= #-g -dtypes # -w A # for profiling add -p -inline 0 # but 'make forprofiling' below does that for you. # This flag is also used in subdirectories so don't change its name here. +# To enable backtrace support for native code, you need to put -g in OPTFLAGS +# to also link with -g, but even in 3.11 the backtrace support seems buggy so +# not worth it. OPTFLAGS= # the following is essential for Coccinelle to compile under gentoo # but is now defined above in this file @@ -109,17 +112,14 @@ BYTECODE_STATIC=-custom .PHONY:: all all.opt byte opt top clean distclean configure .PHONY:: $(MAKESUBDIRS) $(MAKESUBDIRS:%=%.opt) subdirs subdirs.opt -all: byte - $(MAKE) preinstall +all: Makefile.config byte preinstall opt: all.opt -all.opt: opt-compil - $(MAKE) preinstall +all.opt: opt-compil preinstall -world: +world: preinstall $(MAKE) byte - $(MAKE) opt - $(MAKE) preinstall + $(MAKE) opt-compil byte: .depend $(MAKE) subdirs @@ -191,6 +191,10 @@ clean:: configure: ./configure +Makefile.config: + @echo "Makefile.config is missing. Have you run ./configure?" + @exit 1 + tools: $(MAKE) -C tools @@ -224,30 +228,35 @@ distclean:: ############################################################################## # Pre-Install (customization of spatch frontend script) ############################################################################## -.PHONY:: preinstall preinstall-def preinstall-byte preinstall-opt -preinstall: preinstall-def preinstall-byte preinstall-opt +preinstall: scripts/spatch scripts/spatch.opt scripts/spatch.byte # user will use spatch to run spatch.opt (native) -preinstall-def: +scripts/spatch: cp scripts/spatch.sh scripts/spatch.tmp2 sed "s|SHAREDIR|$(SHAREDIR)|g" scripts/spatch.tmp2 > scripts/spatch.tmp sed "s|LIBDIR|$(LIBDIR)|g" scripts/spatch.tmp > scripts/spatch rm -f scripts/spatch.tmp2 scripts/spatch.tmp # user will use spatch to run spatch (bytecode) -preinstall-byte: - cp scripts/spatch.sh scripts/spatch.tmp3 - sed "s|\.opt||" scripts/spatch.tmp3 > scripts/spatch.tmp2 - sed "s|SHAREDIR|$(SHAREDIR)|g" scripts/spatch.tmp2 > scripts/spatch.tmp - sed "s|LIBDIR|$(LIBDIR)|g" scripts/spatch.tmp > scripts/spatch.byte - rm -f scripts/spatch.tmp3 scripts/spatch.tmp2 scripts/spatch.tmp +scripts/spatch.byte: + cp scripts/spatch.sh scripts/spatch.byte.tmp3 + sed "s|\.opt||" scripts/spatch.byte.tmp3 > scripts/spatch.byte.tmp2 + sed "s|SHAREDIR|$(SHAREDIR)|g" scripts/spatch.byte.tmp2 \ + > scripts/spatch.byte.tmp + sed "s|LIBDIR|$(LIBDIR)|g" scripts/spatch.byte.tmp \ + > scripts/spatch.byte + rm -f scripts/spatch.byte.tmp3 \ + scripts/spatch.byte.tmp2 \ + scripts/spatch.byte.tmp # user will use spatch.opt to run spatch.opt (native) -preinstall-opt: +scripts/spatch.opt: cp scripts/spatch.sh scripts/spatch.opt.tmp2 - sed "s|SHAREDIR|$(SHAREDIR)|g" scripts/spatch.opt.tmp2 > scripts/spatch.opt.tmp - sed "s|LIBDIR|$(LIBDIR)|g" scripts/spatch.opt.tmp > scripts/spatch.opt + sed "s|SHAREDIR|$(SHAREDIR)|g" scripts/spatch.opt.tmp2 \ + > scripts/spatch.opt.tmp + sed "s|LIBDIR|$(LIBDIR)|g" scripts/spatch.opt.tmp \ + > scripts/spatch.opt rm -f scripts/spatch.opt.tmp scripts/spatch.opt.tmp2 clean:: @@ -268,11 +277,6 @@ install-common: $(INSTALL_DATA) standard.iso $(DESTDIR)$(SHAREDIR) $(INSTALL_DATA) docs/spatch.1 $(DESTDIR)$(MANDIR)/man1/ @if [ $(FEATURE_PYTHON) -eq 1 ]; then $(MAKE) install-python; fi - @echo "" - @echo "You can also install spatch by copying the program spatch" - @echo "(available in this directory) anywhere you want and" - @echo "give it the right options to find its configuration files." - @echo "" install-python: mkdir -p $(DESTDIR)$(SHAREDIR)/python/coccilib/coccigui @@ -286,7 +290,7 @@ install-python: $(DESTDIR)$(SHAREDIR)/python/coccilib/coccigui $(INSTALL_LIB) dllpycaml_stubs.so $(DESTDIR)$(LIBDIR) -install: +install: install-common @if test -x spatch -a ! -x spatch.opt ; then \ $(MAKE) install-byte;fi @if test ! -x spatch -a -x spatch.opt ; then \ @@ -295,19 +299,24 @@ install: $(MAKE) install-byte; $(MAKE) install-opt;fi @if test ! -x spatch -a ! -x spatch.opt ; then \ echo "\n\n\t==> Run 'make', 'make opt', or both first. <==\n\n";fi + @echo "" + @echo "\tYou can also install spatch by copying the program spatch" + @echo "\t(available in this directory) anywhere you want and" + @echo "\tgive it the right options to find its configuration files." + @echo "" # user will use spatch to run spatch.opt (native) -install-def: install-common +install-def: $(INSTALL_PROGRAM) spatch.opt $(DESTDIR)$(SHAREDIR) $(INSTALL_PROGRAM) scripts/spatch $(DESTDIR)$(BINDIR)/spatch # user will use spatch to run spatch (bytecode) -install-byte: install-common +install-byte: $(INSTALL_PROGRAM) spatch $(DESTDIR)$(SHAREDIR) $(INSTALL_PROGRAM) scripts/spatch.byte $(DESTDIR)$(BINDIR)/spatch # user will use spatch.opt to run spatch.opt (native) -install-opt: install-common +install-opt: $(INSTALL_PROGRAM) spatch.opt $(DESTDIR)$(SHAREDIR) $(INSTALL_PROGRAM) scripts/spatch.opt $(DESTDIR)$(BINDIR)/spatch.opt @@ -332,8 +341,8 @@ PACKAGE=coccinelle-$(VERSION) BINSRC=spatch env.sh env.csh standard.h standard.iso \ *.txt \ - docs/options.pdf docs/grammar/cocci_syntax.pdf docs/spatch.1 \ - docs/cocci-python.txt \ + docs/manual/options.pdf docs/manual/cocci_syntax.pdf docs/spatch.1 \ + docs/manual/cocci-python.txt \ demos/foo.* demos/simple.* # $(PYLIB) python/coccilib/ demos/printloc.* BINSRC2=$(BINSRC:%=$(PACKAGE)/%) @@ -355,7 +364,7 @@ OCAMLVERSION=$(shell ocaml -version |perl -p -e 's/.*version (.*)/$$1/;') # Procedure to do each time: # cvs update # make sure that ocaml is the distribution ocaml of /usr/bin, not ~pad/... -# modify globals/config.ml +# modify globals/config.ml.in # cd globals/; cvs commit -m"new version" (do not commit from the root!) # ./configure --without-python # make package @@ -459,6 +468,7 @@ website: rm -f $(WEBSITE)/LATEST* $(WEBSITE)/coccinelle-latest.tgz cp changes.txt $(WEBSITE)/changes-$(VERSION).txt cd $(WEBSITE); touch LATEST_IS_$(VERSION); ln -s $(PACKAGE).tgz coccinelle-latest.tgz + cp readme.txt $(WEBSITE) #TXT=$(wildcard *.txt) @@ -469,7 +479,7 @@ syncwiki: darcsweb: # @echo pull from ~/public_html/darcs/c-coccinelle and c-commons and lib-xxx -DARCSFORESTS=commons \ +DARCSFORESTS=commons ocamlsexp \ parsing_c parsing_cocci engine update_darcs: diff --git a/authors.txt b/authors.txt index 0cd3bff..d553352 100644 --- a/authors.txt +++ b/authors.txt @@ -5,7 +5,6 @@ Here are the authors and maintainers of the different parts of coccinelle: - parsing_cocci/ (parsing SmPL, isomorphism handling) - engine/ (ast_cocci to ctl, sgrep) - ctl/ (symbolic model checker) -- popl/ popl09/ - tools/ - standard.iso @@ -13,21 +12,19 @@ Here are the authors and maintainers of the different parts of coccinelle: - parsing_c/ (parsing C, unparsing C, type checking, control flow, C diff) - engine/ (pattern matching and transforming, unparsing, ctl integration) -- cocci.ml (driver) -- main.ml, testing.ml -- emacs/cocci.el +- main.ml, cocci.ml (driver), testing.ml +- configure, txt files, Makefiles - globals/ -- extra/ -- tools/ -- scripts/ -- commons/ (utility functions) +- extra/, tools/, scripts/ +- commons/ (utility functions, e.g. for logging, profiling, regression testing) +- editors/emacs/cocci.el - standard.h * Rene Rydhof Hansen - Original version of the model checker in ctl/ -- emacs/cocci-ediff.el +- editors/emacs/cocci-ediff.el - scripts/extractor.awk * Henrik stuart diff --git a/changes.txt b/changes.txt index 130a473..6082e83 100644 --- a/changes.txt +++ b/changes.txt @@ -1,5 +1,80 @@ -*- org -*- +* 0.1.8 + +** Language: + +** Features: +- Metavariables now capture the cpp code contained within their definitions +- When - fragments are separated by ... or nest boundaries in the semantic + patch, but end up matching adjacent source code, the comments, cpp code + and whitespace that are between them are not deleted. +- better parsing of C: do expansion of macros only when needed when + have actually a parse error and also leverage the definition of macros + in the parsed file (or in a optional_standard.h file passed as a parameter). + This should reduce the need for many hardcoded definitions in standard.h +- new semantics for the -macro_file option, by default now expand macros + only when necessary. To force use the -macro_file_builtins option instead. +- a new -extract_macros command line action to help the parser. Works with + the -macro_file option. e.g. + $ ./spatch -extract_macros ~/linux > /tmp/alldefs.h + $ ./spatch -macro_file /tmp/alldefs.h -sp_file foo.cocci -dir ~/linux +- removed -D macro_file option, not consistent with what -D usually means +- reattempt to be more efficient for statement metavariables that are just + placeholders (ie, no modification, no reuse) +- triples now returned from ctl in sorted order. The main key is the + state. On the other hand, the state order does not always agree with the + order of appearance in the code. +- spatch is now less verbose on the things it does yet handle. Less confusing + for new users. +- slightly better error report. Thanks to Derek Jones for the suggestion. +- added the options -linux_spacing and -smpl_spacing. -linux_spacing + causes spatch to follow the spacing conventions of Linux, while + -smpl_spacing causes spatch to follow the spacing in the semantic patch. + -linux_spacing is the default. +- more informative error reporting for the already tagged token case. + Thanks to Erik Hovland for the suggestion. + +** Bugfix: +- better parsing of declare macro at toplevel and in structure. + cf -text xfield +- allowing back typedef names for fieldname +- better printing of else in generated code +- slightly better type inference for binary operators. +- clear out declarer names and iterator names between SmPL files (for + -testall) +- better parsing and type checking of macro type aliases. Cf -test macro_int16. + Thanks to Li Yingtong for pointing out the problem. +- make insert_virtual_positions tail rec, avoid stack overflow pb. + Thanks to Diego Liziero for pointing out the + problem. +- Better type inference for arithmetic binary operators + Thanks to Li Yingtong for pointing out the problem. +- Better type inference for constants + Thanks to Li Yingtong for pointing out the problem. +- move computing of adjacency information for semantic patches to after + application of isomorphisms, because isomorphisms can introduce "..." +- compute adjacency information for negated ... +- record with each transformation site the set of indices of the witness + trees that caused the transformation site to come about. Whitespace and + comments between remove tokens associated with disjoint witness trees is + not removed. +- correct treatment of function pointer typed parameters in the SmPL ast0 + visitor. +- better parsing error message and error recovery when comments are not ended, + when some macros have a weird body, and when some switch have a weird + Body. + Thanks to Derek Jones for pointing out the problem. +- better detection and passing of "dangerous" ifdefs, cf -test + double_switch. +- dropped the separation of decls and body in Seq. This gives better + positioning of the bindings of metavariables shared between them. + Thanks to Erik Hovland for an example that shows the problem. + +** Internals: +- supress warning in compiling ocamlsexp (warning caused by a new behavior + of cpp used internally in processing files in ocamlsexp/) + * 0.1.7 ** Language: @@ -95,6 +170,9 @@ ** Language: - long long added to SmPL +** Documentation: +- add grammar reference and spatch command line options reference + ** Features: - can match patterns of the form unsigned T or signed T, where T is a metavariable @@ -123,6 +201,7 @@ - isomorphisms don't apply under signed/unsigned, to prevent the creation of things like unsigned signed int. Need a better solution for this. + * 0.1.3 ** Features: diff --git a/cocci.ml b/cocci.ml index 337a491..7a446c4 100644 --- a/cocci.ml +++ b/cocci.ml @@ -25,6 +25,8 @@ open Common module CCI = Ctlcocci_integration module TAC = Type_annoter_c +module Ast_to_flow = Control_flow_c_build + (*****************************************************************************) (* This file is a kind of driver. It gathers all the important functions * from coccinelle in one place. The different entities in coccinelle are: @@ -307,6 +309,9 @@ let show_or_not_celem a b = let show_or_not_trans_info2 trans_info = + (* drop witness tree indices for printing *) + let trans_info = + List.map (function (index,trans_info) -> trans_info) trans_info in if !Flag.show_transinfo then begin if null trans_info then pr2 "transformation info is empty" else begin @@ -387,11 +392,13 @@ let worth_trying cfiles tokens = let check_macro_in_sp_and_adjust tokens = let tokens = Common.union_all tokens in tokens +> List.iter (fun s -> - if Hashtbl.mem !Parsing_hacks._defs s + if Hashtbl.mem !Parse_c._defs s then begin - pr2 "warning: macro in semantic patch was in macro definitions"; - pr2 ("disabling macro expansion for " ^ s); - Hashtbl.remove !Parsing_hacks._defs s + if !Flag_cocci.verbose_cocci then begin + pr2 "warning: macro in semantic patch was in macro definitions"; + pr2 ("disabling macro expansion for " ^ s); + end; + Hashtbl.remove !Parse_c._defs s end ) @@ -1019,16 +1026,26 @@ let prepare_c files choose_includes : file_info list = (* r(ule), c(element in C code), e(nvironment) *) +let findk f l = + let rec loop k = function + [] -> None + | x::xs -> + if f x + then Some (x, function n -> k (n :: xs)) + else loop (function vs -> k (x :: vs)) xs in + loop (function x -> x) l + let merge_env new_e old_e = - List.fold_left - (function old_e -> - function (e,rules) as elem -> - let (same,diff) = List.partition (function (e1,_) -> e =*= e1) old_e in - match same with - [] -> elem :: old_e - | [(_,old_rules)] -> (e,Common.union_set rules old_rules) :: diff - | _ -> failwith "duplicate environment entries") - old_e new_e + let (ext,old_e) = + List.fold_left + (function (ext,old_e) -> + function (e,rules) as elem -> + match findk (function (e1,_) -> e =*= e1) old_e with + None -> (elem :: ext,old_e) + | Some((_,old_rules),k) -> + (ext,k (e,Common.union_set rules old_rules))) + ([],old_e) new_e in + old_e @ (List.rev ext) let apply_python_rule r cache newes e rules_that_have_matched rules_that_have_ever_matched = @@ -1122,26 +1139,29 @@ let rec apply_cocci_rule r rules_that_have_ever_matched es (* applying the rule *) (match r.ruletype with Ast_cocci.Normal -> - let children_e = ref [] in - (* looping over the functions and toplevel elements in .c and .h *) - concat_headers_and_c !ccs +> List.iter (fun (c,f) -> - if c.flow <> None - then - (* does also some side effects on c and r *) - let processed = - process_a_ctl_a_env_a_toplevel r - relevant_bindings c f in - match processed with - | None -> () - | Some newbindings -> - newbindings +> List.iter (fun newbinding -> - children_e := - Common.insert_set newbinding !children_e) - ); (* end iter cs *) - - !children_e + List.rev + (concat_headers_and_c !ccs +> + List.fold_left (fun children_e (c,f) -> + if c.flow <> None + then + (* does also some side effects on c and r *) + let processed = + process_a_ctl_a_env_a_toplevel r + relevant_bindings c f in + match processed with + | None -> children_e + | Some newbindings -> + newbindings +> + List.fold_left + (fun children_e newbinding -> + if List.mem newbinding children_e + then children_e + else newbinding :: children_e) + children_e + else children_e) + []) | Ast_cocci.Generated -> process_a_generated_a_env_a_toplevel r relevant_bindings !ccs; @@ -1576,7 +1596,9 @@ let post_engine a = let check_duplicate_modif2 xs = (* opti: let groups = Common.groupBy (fun (a,resa) (b,resb) -> a =$= b) xs *) - pr2 ("Check duplication for " ^ i_to_s (List.length xs) ^ " files"); + if !Flag_cocci.verbose_cocci + then pr2 ("Check duplication for " ^ i_to_s (List.length xs) ^ " files"); + let groups = Common.group_assoc_bykey_eff xs in groups +> Common.map_filter (fun (file, xs) -> match xs with diff --git a/commitmsg b/commitmsg dissimilarity index 97% index 8117a27..f05683a 100644 --- a/commitmsg +++ b/commitmsg @@ -1,39 +1,72 @@ -Release coccinelle-0.1.7 - -** Language: - - initialize and finalize script code, cf demos/initial_final.cocci - -** Features: - - -iso_limit option to limit the depth of isomorphism application - - with the dir option, the include path is implicitly set to the "include" - subdirectory of the specified directory, if the option -I is not used. - - give a seed for the name of a fresh identifier - - better handling of cpp "constructed" identifiers as in a##b, that in - the futur will make it easier to match over those idents. - cf tests/pb_parsing_macro.c. Thanks to Ali-Erdem Ozcan for pointing - out the problem. A new "parsing hack hint" is also available: - YACFE_IDENT_BUILDER, cf standard.h. - -** Bugfix: - - drop excessive "optimization" in ctl generation for while and for loops - - allow . as the name of the directory - - for type inference for an assignment, take the type of the right-hand - side expression, not the type of the assigned variable - - allow for with a declartion in the first header element, as in C++ - (partial support) - - allow for matching against variable declarations that include only - storage, eg static, but no type at all. - - allow for matching against types that contain both short/long and int - - allow the type metavariable in the SmPL code "unsigned T" to match a T - that is a type consisting of more than one word, eg long int. - - -ifdef_to_if option made to process nested ifdefs - (partial support) - -** Internals: - - improve and fix installation process (usable on BSD) - - improve and fix testing process - - apply patches from Eugeniy Meshcheryakov - - reorganize the way we parse C identifiers, especially concatenated cpp - identifiers as in a##b. This may lead to some regressions as we may - not parse as much code as before. - - removed popl/ and popl09/ and popl related stuff from official distrib. +Release coccinelle-0.1.8 + +** Features: + - Metavariables now capture the cpp code contained within their definitions + - When - fragments are separated by ... or nest boundaries in the semantic + patch, but end up matching adjacent source code, the comments, cpp code + and whitespace that are between them are not deleted. + - better parsing of C: do expansion of macros only when needed when + have actually a parse error and also leverage the definition of macros + in the parsed file (or in a optional_standard.h file passed as a parameter). + This should reduce the need for many hardcoded definitions in standard.h + - new semantics for the -macro_file option, by default now expand macros + only when necessary. To force use the -macro_file_builtins option instead. + - a new -extract_macros command line action to help the parser. Works with + the -macro_file option. e.g. + $ ./spatch -extract_macros ~/linux > /tmp/alldefs.h + $ ./spatch -macro_file /tmp/alldefs.h -sp_file foo.cocci -dir ~/linux + - removed -D macro_file option, not consistent with what -D usually means + - reattempt to be more efficient for statement metavariables that are just + placeholders (ie, no modification, no reuse) + - triples now returned from ctl in sorted order. The main key is the + state. On the other hand, the state order does not always agree with the + order of appearance in the code. + - spatch is now less verbose on the things it does yet handle. Less confusing + for new users. + - slightly better error report. Thanks to Derek Jones for the suggestion. + - added the options -linux_spacing and -smpl_spacing. -linux_spacing + causes spatch to follow the spacing conventions of Linux, while + -smpl_spacing causes spatch to follow the spacing in the semantic patch. + -linux_spacing is the default. + - more informative error reporting for the already tagged token case. + Thanks to Erik Hovland for the suggestion. + +** Bugfix: + - better parsing of declare macro at toplevel and in structure. + cf -text xfield + - allowing back typedef names for fieldname + - better printing of else in generated code + - slightly better type inference for binary operators. + - clear out declarer names and iterator names between SmPL files (for + -testall) + - better parsing and type checking of macro type aliases. Cf -test macro_int16. + Thanks to Li Yingtong for pointing out the problem. + - make insert_virtual_positions tail rec, avoid stack overflow pb. + Thanks to Diego Liziero for pointing out the + problem. + - Better type inference for arithmetic binary operators + Thanks to Li Yingtong for pointing out the problem. + - Better type inference for constants + Thanks to Li Yingtong for pointing out the problem. + - move computing of adjacency information for semantic patches to after + application of isomorphisms, because isomorphisms can introduce "..." + - compute adjacency information for negated ... + - record with each transformation site the set of indices of the witness + trees that caused the transformation site to come about. Whitespace and + comments between remove tokens associated with disjoint witness trees is + not removed. + - correct treatment of function pointer typed parameters in the SmPL ast0 + visitor. + - better parsing error message and error recovery when comments are not ended, + when some macros have a weird body, and when some switch have a weird + Body. + Thanks to Derek Jones for pointing out the problem. + - better detection and passing of "dangerous" ifdefs, cf -test + double_switch. + - dropped the separation of decls and body in Seq. This gives better + positioning of the bindings of metavariables shared between them. + Thanks to Erik Hovland for an example that shows the problem. + +** Internals: + - supress warning in compiling ocamlsexp (warning caused by a new behavior + of cpp used internally in processing files in ocamlsexp/) diff --git a/commons/Makefile b/commons/Makefile index 4073a1f..ce53152 100644 --- a/commons/Makefile +++ b/commons/Makefile @@ -29,7 +29,7 @@ SRC+=$(MYSRC) SRC+=ocamlextra/enum.ml ocamlextra/dynArray.ml SRC+=ocamlextra/suffix_tree.ml ocamlextra/suffix_tree_ext.ml -SYSLIBS=str.cma unix.cma +SYSLIBS=str.cma bigarray.cma unix.cma INCLUDEDIRS=ocamlextra ocollection SUBDIRS=ocamlextra ocollection @@ -105,7 +105,7 @@ OPTFLAGS= # ocaml, when it is available, which speeds up compilation. So # if you want the fast version of the ocaml chain tools, set this var # or setenv it to ".opt" in your startup script. -#OPTBIN= #.opt +OPTBIN ?= #.opt OCAMLCFLAGS ?= -g -dtypes diff --git a/commons/common.ml b/commons/common.ml index 1d128a0..c037e1b 100644 --- a/commons/common.ml +++ b/commons/common.ml @@ -237,18 +237,37 @@ let pr_no_nl s = flush stdout + + + + +let _chan_pr2 = ref (None: out_channel option) + +let out_chan_pr2 ?(newline=true) s = + match !_chan_pr2 with + | None -> () + | Some chan -> + output_string chan (s ^ (if newline then "\n" else "")); + flush chan + + let pr2 s = prerr_string !_prefix_pr; do_n !_tab_level_print (fun () -> prerr_string " "); prerr_string s; prerr_string "\n"; - flush stderr + flush stderr; + out_chan_pr2 s; + () let pr2_no_nl s = prerr_string !_prefix_pr; do_n !_tab_level_print (fun () -> prerr_string " "); prerr_string s; - flush stderr + flush stderr; + out_chan_pr2 ~newline:false s; + () + let pr_xxxxxxxxxxxxxxxxx () = pr "-----------------------------------------------------------------------" @@ -385,15 +404,35 @@ let pr2_gen x = pr2 (dump x) let _already_printed = Hashtbl.create 101 let disable_pr2_once = ref false -let pr2_once s = + +let xxx_once f s = if !disable_pr2_once then pr2 s else if not (Hashtbl.mem _already_printed s) then begin Hashtbl.add _already_printed s true; - pr2 ("(ONCE) " ^ s); + f ("(ONCE) " ^ s); end +let pr2_once s = xxx_once pr2 s + +(* ---------------------------------------------------------------------- *) +let mk_pr2_wrappers aref = + let fpr2 s = + if !aref + then pr2 s + else + (* just to the log file *) + out_chan_pr2 s + in + let fpr2_once s = + if !aref + then pr2_once s + else + xxx_once out_chan_pr2 s + in + fpr2, fpr2_once + (* ---------------------------------------------------------------------- *) (* could also be in File section *) @@ -433,6 +472,10 @@ let redirect_stdin_opt optfile f = | Some infile -> redirect_stdin infile f +(* cf end +let with_pr2_to_string f = +*) + (* ---------------------------------------------------------------------- *) @@ -1050,28 +1093,6 @@ let pp_f_in_box f = let pp s = Format.print_string s - - -(* julia: convert something printed using format to print into a string *) -let format_to_string f = - let o = open_out "/tmp/out" in - Format.set_formatter_out_channel o; - let _ = f() in - Format.print_flush(); - Format.set_formatter_out_channel stdout; - close_out o; - let i = open_in "/tmp/out" in - let lines = ref [] in - let rec loop _ = - let cur = input_line i in - lines := cur :: !lines; - loop() in - (try loop() with End_of_file -> ()); - close_in i; - String.concat "\n" (List.rev !lines) - - - let mk_str_func_of_assoc_conv xs = let swap (x,y) = (y,x) in @@ -1083,6 +1104,16 @@ let mk_str_func_of_assoc_conv xs = List.assoc a xs ) + + +(* julia: convert something printed using format to print into a string *) +(* now at bottom of file +let format_to_string f = + ... +*) + + + (*****************************************************************************) (* Macro *) (*****************************************************************************) @@ -1213,6 +1244,17 @@ let save_excursion reference f = reference := old; res +let save_excursion_and_disable reference f = + save_excursion reference (fun () -> + reference := false; + f () + ) + +let save_excursion_and_enable reference f = + save_excursion reference (fun () -> + reference := true; + f () + ) let memoized h k f = @@ -1401,6 +1443,8 @@ let _init_gc_stack = Gc.set {(Gc.get ()) with Gc.stack_limit = 100 * 1024 * 1024} + + (* if process a big set of files then dont want get overflow in the middle * so for this we are ready to spend some extra time at the beginning that * could save far more later. @@ -3300,7 +3344,7 @@ let files_of_dir_or_files_no_vcs_post_filter regex xs = then cmd_to_list ("find " ^ x ^ - " -noleaf -type f | grep -v /.hg/ |grep -v /CVS/ | grep -v /.git/" + " -noleaf -type f | grep -v /.hg/ |grep -v /CVS/ | grep -v /.git/ |grep -v /_darcs/" ) +> List.filter (fun s -> s =~ regex) else [x] @@ -5347,9 +5391,11 @@ let info_from_charpos a b = -let (full_charpos_to_pos2: filename -> (int * int) array ) = fun filename -> +let full_charpos_to_pos2 = fun filename -> + + let size = (filesize filename + 2) in - let arr = Array.create (filesize filename + 2) (0,0) in + let arr = Array.create size (0,0) in let chan = open_in filename in @@ -5394,6 +5440,65 @@ let complete_parse_info filename table x = column = snd (table.(x.charpos)); } + + +let full_charpos_to_pos_large2 = fun filename -> + + let size = (filesize filename + 2) in + + (* old: let arr = Array.create size (0,0) in *) + let arr1 = Bigarray.Array1.create + Bigarray.int Bigarray.c_layout size in + let arr2 = Bigarray.Array1.create + Bigarray.int Bigarray.c_layout size in + Bigarray.Array1.fill arr1 0; + Bigarray.Array1.fill arr2 0; + + let chan = open_in filename in + + let charpos = ref 0 in + let line = ref 0 in + + let rec full_charpos_to_pos_aux () = + try + let s = (input_line chan) in + incr line; + + (* '... +1 do' cos input_line dont return the trailing \n *) + for i = 0 to (slength s - 1) + 1 do + (* old: arr.(!charpos + i) <- (!line, i); *) + arr1.{!charpos + i} <- (!line); + arr2.{!charpos + i} <- i; + done; + charpos := !charpos + slength s + 1; + full_charpos_to_pos_aux(); + + with End_of_file -> + for i = !charpos to (* old: Array.length arr *) + Bigarray.Array1.dim arr1 - 1 do + (* old: arr.(i) <- (!line, 0); *) + arr1.{i} <- !line; + arr2.{i} <- 0; + done; + (); + in + begin + full_charpos_to_pos_aux (); + close_in chan; + (fun i -> arr1.{i}, arr2.{i}) + end +let full_charpos_to_pos_large a = + profile_code "Common.full_charpos_to_pos_large" + (fun () -> full_charpos_to_pos_large2 a) + + +let complete_parse_info_large filename table x = + { x with + file = filename; + line = fst (table (x.charpos)); + column = snd (table (x.charpos)); + } + (*---------------------------------------------------------------------------*) (* Decalage is here to handle stuff such as cpp which include file and who * can make shift. @@ -5896,6 +6001,34 @@ let md5sum_of_string s = | _ -> failwith "md5sum_of_string wrong output" + +let with_pr2_to_string f = + let file = new_temp_file "pr2" "out" in + redirect_stdout_stderr file f; + cat file + +(* julia: convert something printed using format to print into a string *) +let format_to_string f = + let (nm,o) = Filename.open_temp_file "format_to_s" ".out" in + Format.set_formatter_out_channel o; + let _ = f() in + Format.print_newline(); + Format.print_flush(); + Format.set_formatter_out_channel stdout; + close_out o; + let i = open_in nm in + let lines = ref [] in + let rec loop _ = + let cur = input_line i in + lines := cur :: !lines; + loop() in + (try loop() with End_of_file -> ()); + close_in i; + command2 ("rm -f " ^ nm); + String.concat "\n" (List.rev !lines) + + + (*****************************************************************************) (* Misc/test *) (*****************************************************************************) diff --git a/commons/common.mli b/commons/common.mli index 5bbdcfc..723748b 100644 --- a/commons/common.mli +++ b/commons/common.mli @@ -117,16 +117,21 @@ val reset_pr_indent : unit -> unit (* The following functions first indent _tab_level_print spaces. * They also add the _prefix_pr, for instance used in MPI to show which * worker is talking. + * update: for pr2, it can also print into a log file. * * The use of 2 in pr2 is because 2 is under UNIX the second descriptor * which corresponds to stderr. *) val _prefix_pr : string ref + val pr : string -> unit -val pr2 : string -> unit val pr_no_nl : string -> unit -val pr2_no_nl : string -> unit val pr_xxxxxxxxxxxxxxxxx : unit -> unit + +(* pr2 print on stderr, but can also in addition print into a file *) +val _chan_pr2: out_channel option ref +val pr2 : string -> unit +val pr2_no_nl : string -> unit val pr2_xxxxxxxxxxxxxxxxx : unit -> unit (* use Dumper.dump *) @@ -137,10 +142,15 @@ val dump: 'a -> string val _already_printed : (string, bool) Hashtbl.t val pr2_once : string -> unit +val mk_pr2_wrappers: bool ref -> (string -> unit) * (string -> unit) + + val redirect_stdout_stderr : filename -> (unit -> unit) -> unit val redirect_stdin : filename -> (unit -> unit) -> unit val redirect_stdin_opt : filename option -> (unit -> unit) -> unit +val with_pr2_to_string: (unit -> unit) -> string list + val fprintf : out_channel -> ('a, out_channel, unit) format -> 'a val printf : ('a, out_channel, unit) format -> 'a val eprintf : ('a, out_channel, unit) format -> 'a @@ -393,6 +403,8 @@ type 'a mylazy = (unit -> 'a) (* emacs spirit *) val save_excursion : 'a ref -> (unit -> 'b) -> 'b +val save_excursion_and_disable : bool ref -> (unit -> 'b) -> 'b +val save_excursion_and_enable : bool ref -> (unit -> 'b) -> 'b (* emacs spirit *) val unwind_protect : (unit -> 'a) -> (exn -> 'b) -> 'a @@ -1886,6 +1898,12 @@ val full_charpos_to_pos : filename -> (int * int) array val complete_parse_info : filename -> (int * int) array -> parse_info -> parse_info +val full_charpos_to_pos_large: + filename -> (int -> (int * int)) + +val complete_parse_info_large : + filename -> (int -> (int * int)) -> parse_info -> parse_info + (* return line x col x str_line from a charpos. This function is quite * expensive so don't use it to get the line x col from every token in * a file. Instead use full_charpos_to_pos. diff --git a/commons/glimpse.ml b/commons/glimpse.ml index f69879b..6c7d60a 100644 --- a/commons/glimpse.ml +++ b/commons/glimpse.ml @@ -84,15 +84,17 @@ let glimpseindex ext dir indexdir = ); () -let _tmpfile = "/tmp/pad_glimpseindex_files.list" let glimpseindex_files files indexdir = check_have_glimpse (); Common.command2(spf "mkdir -p %s" indexdir); + + let tmpfile = Common.new_temp_file "glimpse" "list" in + (* "/tmp/pad_glimpseindex_files.list" *) - Common.uncat files _tmpfile; + Common.uncat files tmpfile; Common.command2 - (spf "cat %s | %s" _tmpfile (glimpse_cmd indexdir)); + (spf "cat %s | %s" tmpfile (glimpse_cmd indexdir)); () diff --git a/configure b/configure index 477b780..83cb129 100755 --- a/configure +++ b/configure @@ -1,4 +1,7 @@ #!/usr/bin/perl + +# Author: Yoann Padioleau + ###################################################################### # Prelude ###################################################################### @@ -8,14 +11,14 @@ # assume standard: diff # assume standard: perl -#TODO python 2.5 and perhaps a --disable-python +#TODO check python 2.5 ? #old: --with-menhir=/path/to/menhirLib or `ocamlfind query menhirLib` my $project = "coccinelle"; my $projectcmdline = - "spatch -cocci_file demos/simple.cocci demos/simple.c"; + "spatch -sp_file demos/simple.cocci demos/simple.c"; ###################################################################### # Options @@ -160,7 +163,7 @@ pr2 ""; $error += check_config( "make -v 2>&1 |grep Make|", - "GNU Make 3\.[0-9]+", #version 3.81 + "GNU Make [^0-9]*3\.[0-9]+.*", #version 3.79.1, 3.81 "make (gnu version) is present.", "The program gnu make is missing or is not a good version. We need 3.XX", @@ -202,6 +205,9 @@ on the $project website. !!!! "; } else { +#pad: before the message was saying (make depend); make all +# I found this confusing so I removed it. + pr2 " ---------------------------------------------------------------------- @@ -209,17 +215,20 @@ on the $project website. !!!! All seems fine for $project. To compile $project type: - (make depend); make all -or alternatively, for the optimized version: - (make depend); make all.opt + \$ make depend + \$ make all + +Or alternatively, for the optimized version: + \$ make all.opt If you want both, you could use: - (make depend); make world + \$ make world + To install type: - make install + \$ make install Then, to test $project simply type: - $projectcmdline + \$ $projectcmdline "; diff --git a/ctl/ctl_engine.ml b/ctl/ctl_engine.ml index a739d05..65c3338 100644 --- a/ctl/ctl_engine.ml +++ b/ctl/ctl_engine.ml @@ -2471,7 +2471,7 @@ let sat m phi reqopt = Printf.printf "triples: %d\n" !triples; print_state "final result" res; *) - res) + List.sort compare res) else (if !Flag_ctl.verbose_ctl_engine then Common.pr2 "missing something required"; @@ -2484,4 +2484,3 @@ let sat m phi reqopt = (* ********************************************************************** *) end ;; - diff --git a/demos/python_regexp.c b/demos/python_regexp.c new file mode 100644 index 0000000..d362dfd --- /dev/null +++ b/demos/python_regexp.c @@ -0,0 +1,8 @@ +int main() +{ + int x; + + x = foo(); + x = foo_new(); + x = bar(); +} diff --git a/demos/python_regexp.cocci b/demos/python_regexp.cocci new file mode 100644 index 0000000..dc6c76b --- /dev/null +++ b/demos/python_regexp.cocci @@ -0,0 +1,33 @@ +@initialize:python@ +import re +m = re.compile('_new$') + +@r_init@ +expression E; +identifier id; +position p; +@@ + +E = id@p(); + +@script:python@ +id << r_init.id; +@@ + +print "COCCI: Analyzing %s" % id +if m.search(id.ident) != None: + print "COCCI: %s matchs '_new$'" % id +else: + print "COCCI: %s discarded" % id + cocci.include_match(False) + + +@r_do@ +expression E; +identifier id; +position r_init.p; +@@ + +E = id@p(); ++ if (E == NULL) ++ goto err; diff --git a/docs/Makefile b/docs/Makefile index 067c9f1..91d8e35 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -1,25 +1,14 @@ -SUBDIRS=grammar +SUBDIR=manual -TEX=options.tex -PDF=$(TEX:.tex=.pdf) -AUX=$(TEX:.tex=.aux) -LOG=$(TEX:.tex=.log) +.PHONY: all clean distclean -.PHONY: all clean distclean $(SUBDIRS) -.SUFFIXES: .pdf .tex - -all: $(PDF) $(SUBDIRS) - -$(SUBDIRS): - make -C $@ - -$(PDF): $(TEX) - pdflatex $< +all: + make -C $(SUBDIR) clean: - make -C $(SUBDIRS) clean - rm -f $(AUX) $(LOG) + make -C $(SUBDIR) clean distclean: - make -C $(SUBDIRS) distclean - rm -f $(PDF) + make -C $(SUBDIR) distclean + + diff --git a/docs/grammar/Makefile b/docs/grammar/Makefile deleted file mode 100644 index 3657fdc..0000000 --- a/docs/grammar/Makefile +++ /dev/null @@ -1,61 +0,0 @@ -TEX=cocci_syntax.tex -WEB=/var/www/localhost/htdocs/coccinelle/ -EMNWEB=~/website/docs/ - -PDF=$(TEX:.tex=.pdf) -HTML=$(TEX:.tex=.html) - - -.phony: all html clean check - -all: $(TEX) - pdflatex $< - pdflatex $< - -html: $(HTML) - -clean: - rm -f *.aux *.dvi *.haux *.htoc *.log *.out *~ - -distclean: clean - rm -f *.pdf *.html *.gif *.css - -check: $(HTML) - checklink $< - -world: all html - -universe: world install - -install: - cp *.css *.gif *.html $(WEB) - cp $(PDF) $(WEB) - chown apache:apache -R $(WEB) - chmod a-w -R $(WEB) - -emn_install: world - cp *.css *.gif *.html $(EMNWEB) - cp $(PDF) $(EMNWEB) - -############################################ -############################################ - -.SUFFIXES: .html .tex - -.tex.html: -# For Gentoo: /usr/lib64/hevea -# For Ubuntu family: /usr/share/hevea -# For default installation - @if [ -f /usr/lib64/hevea/xxdate.exe ]; then \ - hevea -exec /usr/lib64/hevea/xxdate.exe $< ; \ - hevea -exec /usr/lib64/hevea/xxdate.exe $< ; \ - elif [ -f /usr/share/hevea/xxdate.exe ]; then \ - hevea -exec /usr/share/hevea/xxdate.exe $< ; \ - hevea -exec /usr/share/hevea/xxdate.exe $< ; \ - elif [ -f /usr/local/lib/hevea/xxdate.exe ]; then \ - hevea -exec /usr/local/lib/hevea/xxdate.exe $< ; \ - hevea -exec /usr/local/lib/hevea/xxdate.exe $< ; \ - else \ - echo -e "\n\n *** Hevea: Unable to find xxdate.exe ***\n\n"; \ - fi - hacha -o index.html cocci_syntax.html diff --git a/docs/manual.tex b/docs/manual.tex deleted file mode 100644 index a4e99aa..0000000 --- a/docs/manual.tex +++ /dev/null @@ -1,257 +0,0 @@ -\documentclass{report} - - -\usepackage{listing} - -\title{\spatch and \sgrep manual} - -\tableofcontents - -%############################################################################## -\chapter{Introduction} - -%_semantic_ patch and grep -%next-gen - -%semantic patch/match -%SmPL -%%SMPL => semantic match and patch language ? - -%sed on steroids - -%features - -%abstract away -% - -% - -% - -% - -% - - -%submit idea/patch/ or even semantic patch :) to xxx@xxx - -%############################################################################## -\chapter{Building \spatch and \sgrep} - -\section{Requirements} - -\section{Getting} - -\section{Compiling} -%requirements - -\section{Running} - - - - -%############################################################################## -\chapter{Tutorial} - -%toy.c, toy.spatch - -\section{SmPL piece by pieces} - -%very simple ex -%bigger ex, show different C constructs. -%%abstract space -% -%+ -%- -%* (a kind of -) -% -%first run -%first process/workflow ? -% -% -%then metavar -%sed on steroids -%%abstract xxx - -% show vs perl - -%then context!! - -% -%then typed metavar. -% -%then iso -% -% -% -%then '...' and multi usage (in arg, struct, statement) -%%abstract yyy -% -% -% -%then multi rules and multi usage - - - -%############################################################################## -\chapter{Advanced features} - -\subsection{Multi files} - -\subsection{Position} -%src: a mail from julia - -%Tu peux maintenant mettre des positions partout. C'est interdit d'heriter -%une position a travers une regle qui fait une modif. -% -%Tu peux declarer une position avec des contraintes, eg -% -%position p1 != {x.p2, y.p3}; -% -%Entre les premiers @@ d'une regle, tu peux mettre "expression" et avoir -%une meilleure parsing. Ca permet par exemple de faire: -% -%<... f() ...> + <... g() ...> -% -%pour decrire un + qui a f() et g() quelquepart comme arguements. -% -%Pour les }, j'ai mis un champ "is_fake" dans les noeuds, avec is_loop, -%etc. - -\subsection{Embeded Python scripting} - -\subsection{More on ...} - -exists annotation on rule - -'when any' and shortest path - - -when strict - - -%############################################################################## -\chapter{Examples} -%put additionnal commented scripts ? - - - -%############################################################################## -\chapter{Developing a semantic patch} - -%best practices - -\subsection{Emacs mode} - -\subsection{Basic worflow} - -\subsection{Linux workflow and git} - -%git diff -%git revert - -%multi patch ? - -\subsection{Debugging a semantic patch/match} - - -%############################################################################## -\chapter{\spatch/\sgrep command line options} - -%cpp - -%iso -%rules - -%############################################################################## -\chapter{Other tools} - -%partial-match? - -%cocci-ediff ? - -%coccigui - - - -%org-mode ? - -%patchparse - - -%patch handling (splitter, mailer, maintainer) - - - - - -%############################################################################## -\chapter{Reference} -%put grammar ? - - -%context!! - -%well-formedness - -%limitations -% goto -% ... - - -%lexical conventions -% superset of C -%plus -% blanks, column!!! -%comments, c vs cocci comments -%identifiers - - -\section{Toplevel} - -\section{Metavariables} -%typed metavar -%scoped metavar and rules - -\section{Variables} - -\section{Types} - -\section{Expressions} - -%funcall and ... - -%cf also position trick - -\section{Statements} - -%declaration - -%type definition -% struct iso - - - -\section{Rules} - - -\section{Isomorphisms} - -%named iso - - -%iso file -%extra file standard.h - -%implicit iso - - -\section{cpp quircks} - -%declarator -%declarer - -%also extra file standard.h - -%############################################################################## -\appendix - - - -%index (reversed) -%index of concepts ? keywords ? diff --git a/docs/manual/Makefile b/docs/manual/Makefile new file mode 100644 index 0000000..865619f --- /dev/null +++ b/docs/manual/Makefile @@ -0,0 +1,164 @@ +############################################################################## +# Variables +############################################################################## + +MAINSRC=main.tex +SRC=$(wildcard *.tex) + +#tools: +# latex, pdflatex +# xfig +# emacs, auctex, ediff +# darcs +# latexdiff + +############################################################################## +# Top rules +############################################################################## +.PHONY: all clean distclean +.SUFFIXES: .pdf .tex + +all: manual.pdf cocci_syntax.pdf options.pdf + +manual.pdf: $(SRC) + pdflatex main.tex + pdflatex main.tex + mv main.pdf manual.pdf + + + + +cocci_syntax.pdf: main_grammar.tex cocci_syntax.tex macros_listing_cocci.tex macros_grammar.tex macros_common.tex examples.tex tips.tex + pdflatex main_grammar.tex + pdflatex main_grammar.tex + mv main_grammar.pdf cocci_syntax.pdf + +options.pdf: main_options.tex spatch_options.tex macros_options.tex + pdflatex main_options.tex + pdflatex main_options.tex + mv main_options.pdf options.pdf + + + + +distclean:: clean + rm -f manual.pdf cocci_syntax.pdf options.pdf + + +# lindig trick +#RERUN = Rerun (LaTeX|to get cross-references right) +# +#pdf: $(PDF) +# +#%.pdf: %.tex +# $(PDFLATEX) $< +# if egrep -s '$(RERUN)' $*.log ;then $(PDFLATEX) $<; fi +# if egrep -s '$(RERUN)' $*.log ;then $(PDFLATEX) $<; fi + +############################################################################## +# Html version +############################################################################## +.PHONY: html check + +.SUFFIXES: .html .tex + +TEX=cocci_syntax.tex +WEB=/var/www/localhost/htdocs/coccinelle/ +EMNWEB=~/website/docs/ + +PDF=$(TEX:.tex=.pdf) +HTML=$(TEX:.tex=.html) + +html: $(HTML) + +clean:: + rm -f *.aux *.dvi *.haux *.htoc *.log *.out *~ + +distclean:: clean + rm -f *.pdf *.html *.gif *.css + +check: $(HTML) + checklink $< + +world: all html + +universe: world install + +install: + cp *.css *.gif *.html $(WEB) + cp $(PDF) $(WEB) + chown apache:apache -R $(WEB) + chmod a-w -R $(WEB) + +emn_install: world + cp *.css *.gif *.html $(EMNWEB) + cp $(PDF) $(EMNWEB) + + + + +.tex.html: +# For Gentoo: /usr/lib64/hevea +# For Ubuntu family: /usr/share/hevea +# For default installation + @if [ -f /usr/lib64/hevea/xxdate.exe ]; then \ + hevea -exec /usr/lib64/hevea/xxdate.exe $< ; \ + hevea -exec /usr/lib64/hevea/xxdate.exe $< ; \ + elif [ -f /usr/share/hevea/xxdate.exe ]; then \ + hevea -exec /usr/share/hevea/xxdate.exe $< ; \ + hevea -exec /usr/share/hevea/xxdate.exe $< ; \ + elif [ -f /usr/local/lib/hevea/xxdate.exe ]; then \ + hevea -exec /usr/local/lib/hevea/xxdate.exe $< ; \ + hevea -exec /usr/local/lib/hevea/xxdate.exe $< ; \ + else \ + echo -e "\n\n *** Hevea: Unable to find xxdate.exe ***\n\n"; \ + fi + hacha -o index.html cocci_syntax.html + + +############################################################################## +# Install +############################################################################## + + +############################################################################## +# Developer rules +############################################################################## + +LATEXDIFFOPT=--type=CTRADITIONAL + +#if multi files ? sed sur les \input{} ? ou create in another dir ? +latexdiff: + latexdiff $(LATEXDIFFOPT) main-old.tex main.tex > main-diff.tex + make MAINSRC=main-diff + rm -f main-diff.aux + +replacediff: + cp main-old.tex main-older.tex + cp main.tex main-old.tex + +clean:: + rm -f main-diff.* + +update: + +commit: + + +############################################################################## +# Generic rules +############################################################################## +FORMAT=letter + +%.ps: %.dvi + dvips -P cmz $< -o $@ -t $(FORMAT) + +clean:: + rm -f *.aux \ + *.bbl \ + *.blg \ + *.dvi \ + *.log \ + *.out \ + *.toc + diff --git a/docs/manual/advanced.tex b/docs/manual/advanced.tex new file mode 100644 index 0000000..ad74da9 --- /dev/null +++ b/docs/manual/advanced.tex @@ -0,0 +1 @@ +\chapter{Advanced Features} diff --git a/docs/cocci-python.txt b/docs/manual/cocci-python.txt similarity index 100% rename from docs/cocci-python.txt rename to docs/manual/cocci-python.txt diff --git a/docs/grammar/cocci_syntax.pdf b/docs/manual/cocci_syntax.pdf similarity index 92% rename from docs/grammar/cocci_syntax.pdf rename to docs/manual/cocci_syntax.pdf index c690e60f890d42e0b1a899d4039dfda9be0e506e..d49195f8f0cc0a8d6bc949e4bebdd82a7e705366 100644 GIT binary patch delta 19128 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 L#B_V&(eVEQptS#k delta 21300 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 \end{grammar} -\include{examples} -\include{tips} -\end{document} %%% Local Variables: %%% mode: LaTeX -%%% TeX-master: "cocci_syntax" +%%% TeX-master: "main_grammar" %%% coding: latin-9 %%% TeX-PDF-mode: t %%% ispell-local-dictionary: "american" diff --git a/docs/manual/copyright.txt b/docs/manual/copyright.txt new file mode 100644 index 0000000..e6ad334 --- /dev/null +++ b/docs/manual/copyright.txt @@ -0,0 +1,7 @@ +Coccinelle manual - Julia Lawall, Yoann Padioleau + +Copyright (C) 2009, Julia Lawall, Yoann Padioleau + + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3. + A copy of the license is included in the file license.txt diff --git a/docs/grammar/examples.tex b/docs/manual/examples.tex similarity index 100% rename from docs/grammar/examples.tex rename to docs/manual/examples.tex diff --git a/docs/manual/installing.tex b/docs/manual/installing.tex new file mode 100644 index 0000000..e405401 --- /dev/null +++ b/docs/manual/installing.tex @@ -0,0 +1,16 @@ +%############################################################################## +\chapter{Installing Coccinelle} +%############################################################################## +%\chapter{Building \spatch and \sgrep} + +\section{Requirements} +%coupling: with install.txt + +\section{Getting Coccinelle} + +\section{Compiling Coccinelle} +%coupling: with install.txt + +\section{Running Coccinelle} +%coupling: with readme.txt + diff --git a/docs/manual/introduction.tex b/docs/manual/introduction.tex new file mode 100644 index 0000000..430f2a2 --- /dev/null +++ b/docs/manual/introduction.tex @@ -0,0 +1,59 @@ +\chapter{Introduction} +%src: cocci website, LWN article + +Coccinelle is a tool to help automate repetitive +source-to-source style-preserving program transformations +on C source code, like for instance to perform some refactorings. +%coupling: readme.txt +Coccinelle is presented as a command line tool called \spatch that takes +as input the name of a file containing the specification of a program +transformation, called a {\em semantic patch}, and a set of C files, +and then performs the transformation on all those C files. +%synopsis ? + +To make it easy to express those transformations, +Coccinelle proposes a WYSISWYG approach where the C programmer +can leverage the things he already knows: the C syntax +and the patch syntax. Indeed, with Coccinelle transformations +are written in specific language called SmPL, for +Semantic Patch Language, which as the name suggests is very +close to the syntax of a patch, but which does not +work at a line level, than traditional patches do. +but a more high level, or semantic level. + +Here is an example of a simple program transformation. +To replace every calls to \verb+foo+ of any expression $x$ +to a call to \verb+bar+, create a semantic patch file \verb+ex1.cocci+ +(semantic patches usually ends with the \verb+.cocci+ filename extension) +containing: +\begin{verbatim} +@@ expression x; @@ + +- foo(x) ++ bar(x) + +\end{verbatim} + +Then to ``apply'' the specified program transformation to a set of C files, +simply do: +\begin{verbatim} +$ spatch -sp_file ex1.cocci *.c +\end{verbatim} +%command line: + +%can do inplace, or with git, cf chapter on developing ... + +%Other approaches +%instead of +%expressing the transformation on the internal representation +%of a C frontend, for instance the abstract syntax tree +%used internally by gcc, which would require for the user +%to learn how to use this internal data structure, + +%if can find and transform, can also find, so semantic grep. + +%vs regexp +%vs ast + +%features: +%src: darcs manual diff --git a/docs/manual/isomorphisms.tex b/docs/manual/isomorphisms.tex new file mode 100644 index 0000000..c0348f1 --- /dev/null +++ b/docs/manual/isomorphisms.tex @@ -0,0 +1,2 @@ +\chapter{Isomorphisms and \texttt{standard.iso}} + diff --git a/docs/manual/license.txt b/docs/manual/license.txt new file mode 100644 index 0000000..2f7e03c --- /dev/null +++ b/docs/manual/license.txt @@ -0,0 +1,451 @@ + + GNU Free Documentation License + Version 1.3, 3 November 2008 + + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The "publisher" means any person or entity that distributes copies of +the Document to the public. + +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no +other conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to +give them a chance to provide you with an updated version of the +Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. +O. Preserve any Warranty Disclaimers. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other +documents released under this License, and replace the individual +copies of this License in the various documents with a single copy +that is included in the collection, provided that you follow the rules +of this License for verbatim copying of each of the documents in all +other respects. + +You may extract a single document from such a collection, and +distribute it individually under this License, provided you insert a +copy of this License into the extracted document, and follow this +License in all other respects regarding verbatim copying of that +document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions of the +GNU Free Documentation License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +11. RELICENSING + +"Massive Multiauthor Collaboration Site" (or "MMC Site") means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +"Massive Multiauthor Collaboration" (or "MMC") contained in the site +means any set of copyrightable works thus published on the MMC site. + +"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +"Incorporate" means to publish or republish a Document, in whole or in +part, as part of another Document. + +An MMC is "eligible for relicensing" if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole or +in part into the MMC, (1) had no cover texts or invariant sections, and +(2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/docs/manual/macros.tex b/docs/manual/macros.tex new file mode 100644 index 0000000..3a008b6 --- /dev/null +++ b/docs/manual/macros.tex @@ -0,0 +1,7 @@ +\newcommand{\spatch}{\texttt{spatch}\xspace} +\newcommand{\sgrep}{\texttt{sgrep}\xspace} + +\newcommand{\cpp}{\texttt{cpp}\xspace} + + +\newcommand{\cocciversion}{0.1.8\xspace} diff --git a/docs/manual/macros_common.tex b/docs/manual/macros_common.tex new file mode 100644 index 0000000..2b6096f --- /dev/null +++ b/docs/manual/macros_common.tex @@ -0,0 +1,65 @@ + +% Very convenient to add comments on the paper. Just set the boolean +% to false before sending the paper: +\newboolean{showcomments} +\setboolean{showcomments}{true} +\ifthenelse{\boolean{showcomments}} +{ \newcommand{\mynote}[2]{ + \fbox{\bfseries\sffamily\scriptsize#1} + {\small$\blacktriangleright$\textsf{\emph{#2}}$\blacktriangleleft$}}} +{ \newcommand{\mynote}[2]{}} + +\newcommand\jl[1]{\mynote{Julia}{#1}} + + + +\newcommand{\sizecodebis}[0]{\scriptsize} + +\newcommand{\mita}[1]{\mbox{\it{{#1}}}} +\newcommand{\mtt}[1]{\mbox{\tt{{#1}}}} +\newcommand{\msf}[1]{\mbox{\sf{{#1}}}} +\newcommand{\stt}[1]{\mbox{\scriptsize\tt{{#1}}}} +\newcommand{\ssf}[1]{\mbox{\scriptsize\sf{{#1}}}} +\newcommand{\sita}[1]{\mbox{\scriptsize\it{{#1}}}} +\newcommand{\mrm}[1]{\mbox{\rm{{#1}}}} +\newcommand{\mth}[1]{\({#1}\)} +\newcommand{\entails}[2]{\begin{array}{@{}c@{}}{#1}\\\hline{#2}\end{array}} +\newcommand{\ttlb}{\mbox{\tt \char'173}} +\newcommand{\ttrb}{\mbox{\tt \char'175}} +\newcommand{\ttmid}{\mbox{\tt \char'174}} +\newcommand{\tttld}{\mbox{\tt \char'176}} + +\newcommand{\fixme}[1]{{\color{red} #1}} + + +%------------------------------------------------------------------------------ +%%%Squeeze space in bibliographybg +% \let\oldthebibliography=\thebibliography +% \let\endoldthebibliography=\endthebibliography +% \renewenvironment{thebibliography}[1]{% +% \begin{oldthebibliography}{#1}% +% \setlength{\parskip}{0ex}% +% \setlength{\itemsep}{0ex}% +% }% +% {% +% \end{oldthebibliography}% +% } + + +%------------------------------------------------------------------------------ + +%christian lindig tricks: +% http://www.st.cs.uni-saarland.de/~lindig/tex.html + +%\newif\ifdraft\drafttrue + +%see overfull +%\ifdraft +%\overfullrule3pt +%\fi + + + +%\def\<#1>{\texttt{#1}} +%Now I can write \, which feels more natural +% in the editor than \texttt{some code here}. diff --git a/docs/grammar/grammar.tex b/docs/manual/macros_grammar.tex similarity index 100% rename from docs/grammar/grammar.tex rename to docs/manual/macros_grammar.tex diff --git a/docs/manual/macros_listing_cocci.tex b/docs/manual/macros_listing_cocci.tex new file mode 100644 index 0000000..7ed91f9 --- /dev/null +++ b/docs/manual/macros_listing_cocci.tex @@ -0,0 +1,45 @@ +\lstset{basicstyle=\ttfamily,numbers=left, numberstyle=\tiny, stepnumber=1, numbersep=5pt,language=C,commentstyle=\color{OliveGreen},keywordstyle=\color{blue},stringstyle=\color{BrickRed}} + +% +% You must prefix the +/- lines of +% cocci files with @+/@- respectively. +% This will enable the automatic coloration. +% +% Note: You need at least the following version of hevea +% http://hevea.inria.fr/distri/unstable/hevea-2008-12-17.tar.gz +% +\ifhevea % For HTML generation +\lstdefinelanguage{Cocci}{ +morekeywords={idexpression,expression,statement,identifier,type, +parameter,list,when,strict,any,forall,local,position,typedef}, +keywordstyle=\color{OliveGreen}\bfseries, +sensitive=false, +moredelim=[is][\color{blue}]{@M}{@M}, +moredelim=[il][\color{OliveGreen}]{@+}, +moredelim=[il][\color{BrickRed}]{@-}} + +\lstdefinelanguage{PatchC}[ANSI]{C}{ +stringstyle=\color{black}, +moredelim=[il][\color{OliveGreen}]{@+}, +moredelim=[il][\color{BrickRed}]{@-}, +moredelim=[il][\color{Plum}]{@M}} + +\else % For DVI/PS/PDF generation +\lstdefinelanguage{Cocci}{ +morekeywords={idexpression,expression,statement,identifier,type, +parameter,list,when,strict,any,forall,local,position,typedef}, +keywordstyle=\color{OliveGreen}\bfseries, +sensitive=false, +moredelim=*[is][\color{blue}]{@M}{@M}, +moredelim=[il][\color{OliveGreen}]{@+}, +moredelim=[il][\color{BrickRed}]{@-}} + +\lstdefinelanguage{PatchC}[ANSI]{C}{ +stringstyle=\color{black}, +moredelim=[il][\color{OliveGreen}]{@+}, +moredelim=[il][\color{BrickRed}]{@-}, +moredelim=[il][\color{Plum}]{@M}} +\fi + +\newif\iflanguagestyle +\languagestylefalse diff --git a/docs/manual/macros_options.tex b/docs/manual/macros_options.tex new file mode 100644 index 0000000..ea919e4 --- /dev/null +++ b/docs/manual/macros_options.tex @@ -0,0 +1,6 @@ + +\newcommand{\minimum}[2]{\paragraph*{\makebox[0in][r]{\FilledBigDiamondshape\,\,} {{#1}}} {#2}} +\newcommand{\normal}[2]{\paragraph*{\makebox[0in][r]{\BigLowerDiamond\,\,} {{#1}}} {#2}} +\newcommand{\rare}[2]{\paragraph*{\makebox[0in][r]{\BigDiamondshape\,\,} {{#1}}} {#2}} +\newcommand{\developer}[2]{\paragraph*{{#1}} {#2}} + diff --git a/docs/manual/main.tex b/docs/manual/main.tex new file mode 100644 index 0000000..52cb41c --- /dev/null +++ b/docs/manual/main.tex @@ -0,0 +1,202 @@ +\documentclass{report} + +%****************************************************************************** +% Prelude +%****************************************************************************** +%------------------------------------------------------------------------------ +% Packages +%------------------------------------------------------------------------------ + +\usepackage{ifthen} +\usepackage{hevea} + +\usepackage{times} +\usepackage{fullpage} + +\usepackage[T1]{fontenc} + +\usepackage{amsmath} +\usepackage{amssymb} + +% fancy symbol, but require latex-extra-fonts (huge) package +\usepackage[geometry]{ifsym} + + + +\usepackage{graphics} +\usepackage[pdftex]{graphicx} + + +\usepackage{epsfig} +\usepackage{subfigure} +\usepackage{wrapfig} + +\usepackage[all]{xy} + + +\usepackage{fancyvrb} +\usepackage{moreverb} +\usepackage{alltt} + +\usepackage{boxedminipage} + +\usepackage{xspace} +\usepackage{endnotes} + +\usepackage{multirow} +%\usepackage{colortbl} % conflict with color package below + +\usepackage{listings} +%\usepackage{code/lgrind} + +\usepackage[pdfborder={0 0 0}]{hyperref} +%\usepackage{url} + +\usepackage[usenames,dvipsnames]{color} + +%------------------------------------------------------------------------------ +% Shortcuts +%------------------------------------------------------------------------------ + +\input{macros_common} +%e.g: +% \newcommand{\mita}[1]{\mbox{\it{{#1}}}} + +\input{macros_options} + +\input{macros_listing_cocci} % order is important +\input{macros_grammar} + + +%------------------------------------------------------------------------------ +% Globals +%------------------------------------------------------------------------------ +\input{macros} +%e.g: +% \newcommand{\avgcorrect}{96\%\xspace} % if consider all files +% \newcommand{\MyTool}{aComment\xspace} +% \newcommand{\bugsfound}{XXX\xspace} + + +%****************************************************************************** +% Title +%****************************************************************************** +\begin{document} +%don't want date printed +\date{} + +%------------------------------------------------------------------------------ +\title{ +{\Huge \bf Coccinelle}\\ +{User's manual}\\ +{release \cocciversion}\\ +} +%\title{\spatch and \sgrep manual} + +\author{ +Julia Lawall and Yoann Padioleau \\ +{(with contributions from +Rene Rydhof Hansen, +Nicolas Palix, +Henrik Stuart) +} +} +%src: Xavier Leroy manual + +\date{\today} + +\maketitle +\tableofcontents + +%****************************************************************************** +% Body +%****************************************************************************** + +\chapter*{Foreword} + +This manual documents the release \cocciversion of Coccinelle. +It is organized as follows: +\begin{itemize} + \item Part~\ref{part:usermanual} is an introduction to Coccinelle + \item Part~\ref{part:refmanual} is the reference description + of Coccinelle, its language and command line tool. +\end{itemize} + +\section*{Conventions} + +\section*{Copyright} + +%coupling: copyright.txt +Coccinelle is copyright \copyright 2005, 2006, 2007, 2008, 2009 +University of Copenhagen DIKU and Ecole des Mines de Nantes. + +Coccinelle is open source and can be freely redistributed under the +terms of the GNU General Public License version 2. See the file +\verb+license.txt+ in the distribution for licensing information. + +The present documentation is copyright 2008, 2009 Yoann Padioleau +and Julia Lawall and distributed under the terms of the +GNU Free Documentation License version 1.3. + +\section*{Availability} + +Coccinelle can be freely downloaded +from \verb+http://www.emn.fr/x-info/coccinelle+. +This website contains also additional information. + + +\part{User Manual} +\label{part:usermanual} + +\input{introduction} + +\input{installing} + +\input{tutorial} + +\chapter{Examples} +\input{examples} +\input{tips} + + +\input{isomorphisms} + +\input{parsing} + + +\input{workflow} + +\input{advanced} + + + + +\part{Reference Manual} +\label{part:refmanual} + +\chapter{SmPL grammar} + +\input{cocci_syntax} + +\chapter{\spatch command line options} + +%coupling: ../spatch.1 +\input{spatch_options} + +%****************************************************************************** +% Appendix +%****************************************************************************** + +%index + +{\small +\bibliographystyle{acm} +\bibliography{main} +} + + +%****************************************************************************** +% Postlude +%****************************************************************************** + +\end{document} diff --git a/docs/manual/main_grammar.tex b/docs/manual/main_grammar.tex new file mode 100644 index 0000000..b46185e --- /dev/null +++ b/docs/manual/main_grammar.tex @@ -0,0 +1,45 @@ +\documentclass{article} + +\usepackage{times} +\usepackage{fullpage} + +\usepackage[T1]{fontenc} +%\usepackage[latin9]{inputenc} + +\usepackage{ifthen} +\usepackage{hevea} + +\usepackage{alltt} +\usepackage{xspace} +\usepackage[pdfborder={0 0 0}]{hyperref} +\usepackage{listings} +\usepackage[usenames,dvipsnames]{color} +\usepackage{multirow} + +\input{macros_listing_cocci} +\input{macros_grammar} +\input{macros_common} + + +\ifhevea +\newcommand{\phantom}{} +\newcommand{\air}{ } +\else +\newcommand{\air}{\phantom{xxx}} +\fi + +\title{The SmPL Grammar (version 0.1.4)} +\author{Research group on Coccinelle} +\date{\today} + +\begin{document} +\maketitle + + +\input{cocci_syntax} + +\include{examples} +\include{tips} + +\end{document} + diff --git a/docs/manual/main_options.tex b/docs/manual/main_options.tex new file mode 100644 index 0000000..c02f43e --- /dev/null +++ b/docs/manual/main_options.tex @@ -0,0 +1,21 @@ +\documentclass{article} + +\usepackage{ifthen} + +\usepackage{fullpage} +\usepackage{amsmath} +\usepackage{amssymb} + +% fancy symbol, but require latex-extra-fonts (huge) package +\usepackage[geometry]{ifsym} + +\input{macros_options} + +\title{Coccinelle Usage (version 0.1.7)} + +\begin{document} +\maketitle + +\input{spatch_options} + +\end{document} diff --git a/docs/manual/manual.pdf b/docs/manual/manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b8058544d857cf28553d1e862ba44fa0e87c5a72 GIT binary patch literal 350573 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%0AnO(JVi%ou5B1?x5 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

%_|DOU) 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

vrncv~Pme^- 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


<}EB}MmOwgHHuoXwvVyK$>Mm}W;lN#98 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

g_7_!I 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 literal 0 HcmV?d00001 diff --git a/docs/manual/options.pdf b/docs/manual/options.pdf new file mode 100644 index 0000000000000000000000000000000000000000..be99d47b3c9508b038b8f2523f22eed78535a5da GIT binary patch literal 93633 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

S{ zhtH4vsghEDHCNy2yi7NTT!HSeIExd=ZVW!9N^HPU?oIYj+VRfH3Vd3OFQqF>x1cNb z8!O4}!a5?^l>mi28iQie-|kmZWiEfWa5x-~La4k2N^LpVyND;n(zFzs^KSBo>zpb@ z(sz{d65IISkH=HG#7tO0i7IrDDo)1>ZSbabG&l&hG}Qp$@pLzioM6%;Zs-THG`@IJ6!MY|rxMz6?|_rgJ~9 ze`|A)u965mpnVx0oouS665NzXcgfJ?xo(xY--xcAIQgs?yX=O~PuE=1#<7>gZy#Fu7x7gxT-a2uapb72}Q zwtmNZ{cp$4hP+3eLdM43rbbylSyY6ptlRwpo7d`V zIMF3`z*Q6}K&NTH&j%PPh;Z${7*G7?>EZsFFXO+4ra~$LGJ>Mt;|VFT{}!4u{JS%y z`=0LN|9L#|U2gZ^J5!o}cX*j z0r({O6BEID#s>O+h4YC~9R6goZ~CzshRqJ@23*0#g%2FhxAz2p)!l(}-hqRUNDiz| z-~lfp;Q(y{6oqlYE2Ig8sF9Oj7#4@i*E_NbV*0k(KQIEG1I|$UgTsRkSkTfEsO+o4 z7Ni6u(>J<`Pl5D@va)Y!VHjf%hN-n#NY8r=F(xM?g74Xuo&x&Ymsl$ZZsw*Cu<0jB z0@^k09EzdI9xxqP8X+B(|7J1pR^$6u>_d0DMBB;=Io9gu{3m|?XLdte<#%7o7Y)$r zT00vkE-(~I+G~ zOQ4*$c3opq&e*#*q@H#%9w5e8qCQ@Tu~A@Mv=_2_o82FD5ue}9di5*#yWn&YUxau- z^#eYk5nw&kFCnVH6Y@TxuszgwA)90)U%5|^P(H_A{=4|@**W+4yWZJ3?;$)ODN0{6 zZ$BD&2jFy-zkXl6%|HLXnrHrg&#{vCo=5AA_ugA2HR^N5W9k{clZx>L-mc?Fl8@zT zEBGs{rv3}Lw(+ArEAc?9>qO`I65(1V#6{_=E5ZkAlhyPQVrzWzQ{d5O<`(`-;T?i~ z<&%Gz_e1Rqa^-#WO9Aeil3J{J_`T>nZ*J{QTW{hvT-P)Mt$irn;JsP!jK6_beD=9q zRebfi1XzAAJz0LOt+g}ya5!`T8o%=b`I#49@tF~oH@xuCFFH`4wLk7f_B>=}bjnq~ zY6m`LUcG`l%Qs3CQz8lBHYb$9!TdRBA1!PVA^ND%)xfuNTHTeqXN-AS>E9gt~`(ohe z(8%a+_0ZMnSLA`~R$hG&(RFqEqjgX{_Hi}X6}RSR-&4Q+2lQ5A>xa|qrb_!)(A5R^ z_o3);eT8~l?L#`gKb3qvd7+?!wR+Hdd#XHth8$$u{Dk)nNf0J@T0pv&!E1mTT^O1uUCrqGcyS# zFfVth>*1>eO&TJloE_vbS7lpK#L&Nv?spj@HzYAkF~F9LxDQ3shrXe~BB4vx9;*WV z0;_HoTODPD7PU@u;2?l9uM~fWOD6_c44%vF!v4k^CH=FzLvAnAA)ood%qdqaPNQPP z&Iw{}uDFIvP0pHu>8GG4;>dXr(q@Nd;5>|=XLtqzwaZLag`iosS7Ich+#AG8VoaTF zJ(k%1!K;!TZmO7mAfQ>$fGeep^}#98BwukBHOmBLfv}^UoPKGBUzYT&uWT^UTgu^I%eC?ufDWY4DqxMt;$0 zeTfa|wvYiN`E|KRAP@902PECILdoqn1gTXWAvmNV1P?F3fcadv2U5A#2e!Ss!FCH% zYB5q{YMyu?^vY4ZV+TR)f_kj7po5?w0@yu4hnl;UqX2Ye^mi#3O%Sts+_!fOOIGuB z;`7(ktK~U+UW^tzghaJTH2H+GN7!Ebn>|_U*vc>-iROn?jK&1+3+-|iiE+I^I-xC* z@>C0wQeld$V7f8!`h_>Mbpy9m1-l*EzYH}C56Lk@IAX7)MR)~%aVkm0yj&+?d6ZV` z>5q}-x(S>oA;LT?C6MjwqX>8>l3RA7P#h^HrLPoXzU%wPc-qy;;4dje3OaI`>Vs!w zwGniMqPHRT!y8~fuz5zL&w(}PD)$E`o04TOLj)?Q^d4DqR!qS4vOz;+4wJg*FMhS` zJ}N0iy36?18uzs%u6l132r9ljGLOzx5>aA37Va5~YiQ06lPz(-vMshFtM6hbuyLR#0&tFwfvCGgJL*eC0Qk|i2hd}NMCibVqQ!2I+|HtH}U`i!VI3%~@ zj5@XPx%{29RdjVp$%8XDifUXK@9oIg#O-?eI$8w6^?aRLLiFNx{NJ<9;N=#FRKBwO zZu=x`HY#x2!M?!$z^K!Qe28+9*UWuE{F#Asi(EWVa2`b*JRaEwOw@hbWC&LYX3jw@ z#I`{pc@T-066nk}Shne&H{KLw)5f0nbx!k|4c7spfQ%SXBrk#1AspePD<^IKI z6-D@2LMOOQ=mvR%ZR8vUBZ&kGiT)Z%P{A`y*?>+*3{n3bjYH%otv z6CCleuM7Pci+Ta5~r!$Asgc)cRjhOvDa9JnMtCgQqfg4R9%z z5Rpk$bu6IbApo|(U}#yzhdgL>xT2QN|#N(`QD8)LWQ>A6)e0_IoHlgkI4kK#^^cfinC)q{t!=4G2DsWrh5m{4cB zaIBin2SwZ}Y>Q%~n&#KZY0X<2Fs&U4MdwPaQEE2+BaIBC;-E$fFrF)otuSxi^gU(!F5_>ugGT9&=m}E z$*s`tmnxf103r90Q0GSE7&@Md-mxiZ;D*hFS}v(M2b*2&!OO^=;+e&m@QB!yUHb>Z zTl9BDSS3cbKbP>m<3PdkDc?`?2N#&*8R;j|;QPL$Wo(12Fn3OCzU_Ng0ybolPjf zZTWZu8tI89Yjz0&I?deo{QV^F=D`Pz318Q4ELpsP`9 zxSF2=Mn1NeV=a7JcuWVEB_u)m0i!RYv&PNdm&Bb_F{pKFL$T456P?_f(FVWjO}>92 z%V?hPRT>RAGAqg{D%1ws029aJ`yQ}(N#^q@-AsdoB6DN( z*%+mT{z^Op@8YC6LtU$AWm8CiuQQJjsDxJ;NmKf5Q+jTDH=Ba}FD;iHvNsFVk)Eim zyywXNvxE>6M#WBYpTq#!WBWF{RYA%Ymn+Yk+3<>ZlTJc$1@FO%A}|+>^X=fVDZAF> zt@L0HFLLZH-BL(9Uxx#5WxAxz zV*1Rz3^`>yVLWg17sXRbQ6vTA z89w=ITewm!s0&V+Y;^R3;Cgy6e{dgNZ-&>TzI~+R2VH^WFsQYIx(O=_rbS8EkjiO2 z4X=io=W_2%bp&1t&ql7OISjgMTQ9Q^<5{_=Ba}Y^nu#tWaA(Q!jVC01yl<}cP8IxV z-Wq!+o+80~e(H9^{pne{LR3dQ%f-_YtNb-yf|}c z@?bK1e+Aa&;9!EZSH%NaFrD%+qggznIKjRhW!;>YzH_{)p!Iw32+a5sUWTY7+rv)% zN>EhquM5&Vs3VKD$IXlt){t9b1*%~##T^dxOgSh74F94NA_9GV{M6!Vs-@P*JRUSS+pbn=}^$+?H)Xh_p)}8=`yQd+0w{f5>nMI>dIOlHSU@q;Te?0jwc8G{QILaMiC{h;Ni-XePCd2!F3D7P za}AGAO9_wW)?{P8!fgWA;TlmTj~)WQOYw+SK zTLiqRCH-=K8=_Q|7ku&uqAOAgzna*Xln2wh3CU}uO4KHZczT*OeOyqgwI?T8__R=G zQu`^T)!uty6gYJ@@pr7E#8op19wiw~xN}%ce)u)~U$Hy8Ol@+iX0()C0nkBUsjQI| zU3McY0$7DWxRTUHf=EUEVisOFDnRqo>bE!0-#3EZ)V}Yx9v1kNu%Gk`4RXATLJeP92f|-wx9qywzZtZUjj3hUq=3?Y{wr;N^ zX!~X5CSDAWGjhUuA_G&)UNF;XsI}51H{KNFqRgV|MKyKoI42|x4Wh17K0VDobdsT$ z@#ZKTiHC*pD$AwBJDA4O<=xV$-&e7cR*hn|t{#p*Mj5UA6$T9s-O1ty*jyvG3V1;W z7dQM&R*zUVKf;#F`uwod}SudUg;y0=(Qq;3K-1}>KWy6cJ^uY@t+ zm++y}y$HtFCvM$1p(m-DXTuz43bhwE-bJy>Urcma6)jc{)F(s33t z;9yn zC0B>K@OQALJmAbzGX?}U?A)*3y!1b^`HZW3YeL*8^wAHfe4-K6-eE0F_2DzN*n92z zhv%F>qZUFQa-k6yOLw2_?KfXZmKl}2V(4;lzlL&syka{1>(?aHscdR=5x6mg56RHo zeyM9qrAKmN|Fqq6Sty8JSDBb8$z@~ldW@Reo9R);IoX5))DwZT+Id@2vzypekmAP# zL+RhljRmNns9@O`4wkOi3df}R1|hK6=G1FJc-fn9DI9g>gq(r5e6GdSM=EjJKQV5! zjgQexaSqU8#*WBU^$gtLBB^dhk}Gc(ara4Y1HWorNPCjPcXeZ7^QUx;{*0lxr?F`(#^>YHOEDV z2z6v>6AeTBXT4X>*xu=DzX)XAz5D$AjMj$X_B)Q?ubH%HC zs9DmAP6Ig=l*Etw@1pgG>>~jhJUSJ^q!Xv;ly%-yC%-`ahmu;9t_+)|As=*$_(P8P`dvT}z^5OCVcpr^1y!w#`<%+Z3nfJZC&)U&k%T;9< z2=&^rP+?t$G0j~C?xI+pSm6|pgDB~iaFe`xT8-<~dYZq$hZ#s*pibcl4?A12bMew^ zbz7LD5xP`xYbKwp>)eQh@!W)yC7@Q;$A;&^Pj=j)9Wi!e!Z)3Z{=H1sd*}uG!AckC z)*T^oYC-)j>D@i1U0nChoCAlfWr7h|)kdGHg`S8n*(Ee}eV1Ul{*z6ntHW>An_ zCo*ohfQrw3O6HWj&rGP}Nv>w&4Ufbi^A1XoeF5DZB=5`tT&%Vv`|d^E5H!+unxiyHK_edg0KdjUFEaGfVz>c>dZtE+-6>GqH77-Ce}WPWMibBI`&3EDt(7R zGXk+A6|yOV*birtfuRMmMY&eL!fXeoHz0TuK+}jnd#%dK18*9@?`oj-w)KxpsvlR$ z%0;x@hqfQt+Gbj9>y?9aD~Oqh(inFNk16m|=4tXX{TBzis=lw&@x#2lHh)I&*80Zu z011tPiq$3qFXqK*`(#I#zftsvAuo#9i&)RvsOb7d(jMArbzwxrZtS<^%3> ziNL@~u~^Y%wum)_nIs+gdgyqX-4ZDJo&_3B3uaM%sLx-bljquzB)e38lNlH0o z;R;(NyeAAOe72cG$dchG#_oVWsEGr9?JT-t8=5H(V`G6hma3``T zoExfDjP(xSk)jFY?-Fs(l`C?vzqq!AJ$g?$?Ha-X7EGSku_98pLZMOpBF1L7K%(k&$%a7%A-tNT zrywiSc$+}&%i_JH;GMfM&2N5hRpIj!=4LaY)T_`(csO*w~V^%gcm zf1&BZqd=^)!oGF+P3};QH6kNHsTA-dz;v|<%Sc)? zz8xv|yr!ghfUGM)$~pM>!8#}9BxpkOt6gY64^P*E@eBTRPc6d2lLheK9 z6M_ytL;v39LEoch=}*Ro-)_8|e`vrgD@Cq&ET({Vgzs`q*PtWRrYu>%IBJ@)9B@&) zEWZ5B?NerijdT(OEEiK!vXQ!{@?5SllKPJp4*kh%xfjN}^5H0n{!U~dNq&0aB+YP9jlu*jJ0|EAM|r3yJosIlM% z%8P)f=hIe{adbhXNdCMM=0<`=09_!ar`DL=?5y@@+&YJd`f*F`1OgRU>$j)1GwHPnaeFAfP z3%xym5PDEm;7Q5nhdJ~!QOBXP3qNyE)Zf&rUcP{)i@v;noH*k9e6PxLZm4Exj=nO< zFmHp7b=z<4vf6fbLaH_F!pJVeHi8(^6Buwe746V2)_(3=@9K0OdijgxaCj3@Gx~ig zdfsR&i9T8NaS>RIuBc;5fLDky`6CIY$&+?R7gFFRyGtX55Top4TaHRSu5Fo4Hxf>> zX4q>M(=vY+vsN?8J0Or-Ij`MhCCp-#k|P-yy13mA#ZeM7ofgi$t385FF4i>FD^Kv; zdWi#mvvW@s3^K3{bAsJY6UuBL;hA~}Lxb7;wI@Ufl#CvX08P&Z!gr&csg|(Vpk{av zDk^M?V7Y3tFI}_Azq&2UBu%ZM{f+a_$dd@jUxzJdN+&W`>zJ~P zK_W)Ru`a61k7Pz*kXCVY6M8cc2GCG#K6UO9Wz-#UcTws*C8~g(V}AE$VRVmE3mdP4 z5tNcKb9ZQMn1^$Ck~OrnyAlOlRaWrDzV{KQi_<)Ah9Z=cYR}fz?S&IGVa`OQJ!Q9e zw(LvaAQ_D^Qx|v6lQq9{IJTM7hO0HLD=3lwvgWJ?yJ+g{)t?f)$fYE~D~IuBh$8Jb zdt27;EB2)zjJ18~rCSoylL2O(E$8Ou6u?7*GYsUQYJN)yf9LobI|0|`UyJ0mRfSjQ z3#y0M642fzRtjMo(4B}q(lh*Z=#e=O+{%frZNq+oy7Ovm@VT9phku54yxMr8LO&Qc zXu5$ko#mUKwH%91If5@x;iuwx8YmxujfE>)rty=dJk%I2`Q#a$`n{UX&4g?M>da%WLWvCPY)L-W1O&WJF-&xZ!M9UmF(NzX zq@hz&*5w%j9N}JTw8p5Cni3f~Nb`KRCKhH9+gfJQrCXOmWYj7aSbXO{K3sJT=ZPVu zVn~cMC&@vy(aLH+#KAi7~hV07i&Kon4CPDZL6$GIdC=lX+_KDr@ z8v=C+ND~(myBX9B=lyue=}tfHU$$Ss{tGbfgt}sD)zjkC|84W!X~H1w<{p|#+CAd? zD4P{q*8Cb@4{Cw+Ab{RRJW>oUv9jIO$zrIZ-gl^bB8I^|vsq0zd~64eQZdk-idBp2 zM73Q=5oVQC1r?w|3!$A8L5kiu6;Oh5j#tTr7I2#S!x;#&uJlH*#v3Y6x=ENkk;MfY=p;o?!c9EfjV7w`I@o(s~ zyiD$yNA;T?TcC*@fL577?(-$8b}h!$@lNi`)o|8t8BRaWePbf#Nbz|tr;c9e<`|=k z^zlZW?_V%xqE4!fB$qZXtGNjW>`$K8?!eYD!fpO$T1dRyUUraZ1S@kJWeQL(NF~Fe z78NbB7_P70E|dAVjPQp3qzb5Uw{1#vHe~hkG`%WTCQU)(EfhKx4f9HTze1(!ZD%>XlTbyf`}(GjM<0cOy@;3{S$mL3n!Ml| znH_60B^i*yf%jfA z+@wvi4{`1lOx`K56F~U7+b^6y$M~XZgA?~6DvsYcRBS7g%f(c+yC6*t(ls)9um8fg zn)&Lm9$n(5a<$O%3(L$n*YuCK9SIZx{IRpH%n9XUE6SUv`- zLY*ivr%K^>Gih%h;WNu6L_N-Vq$`_6mIXjgA3;5IF@+BRdgK%g-53XmFy@L>F2s)d zd3gE`8Pvp!xk@b-o4An1fnjC~GQh%4Y!`4FVw2XbdU4zS-L2VYIgMRepu9Iy7?mry z20hSh7%^N2)7Bhq7Z@6zvRiakA?7lnrX!F6owHqp<=E=Lf3VZ4@C=a{hsS0rPMN$) zV{e-Ha?!7&&w54WZ=F3i|5IVz;$UB%=YbvW{b*Qio{2CBxT3xM2TSZvSI=YhQ%B(_ zLM?D*P(UL3$j+>ji?O2dbg`=X@GkdJTux0e5&e~VWFM*cn^x5t0oW6U3w6=*mg1@1 zAU&%IannFA-2_N1hKkB+5!_b1HjEic?^j|v-D#&B46}cIgabKAWp859YE>9D^6~4W zq!JDsdwjY;`s({e>fF1^VZkT;0b!Bkd^pj9@r3KR5w6?^?yOdFyKgG4guheqR7KB7 zwNr92`Cm*Un^NzdP*mhA68IJ=gKZc~sN4JHn(HZX43a|QV!iS3jRl5kfs|Q!Mab=e zcEWm_5r4wk9lfV-l=^jSc2}f%Dfa_lCWjKuw3` zEG1x59WGDR%S1%0%$&ilGvmH7TU5)&QT&&yg7&Mz`tQQXO{dvF_0^o1^~}Z3qs&#y zYWTx5W)(Q)GnpjZ`*x1xL#NyI^G4eFihgui4V%zzD86cptnBi1P~WF{=42eyDies> zUh8gnNiwLQF=6HSRd3IyX85kE;_pZ~e%GstKkobrZG5Xoo86@%U#RC`B}v}kFxJgW z7KT-O7y=Y~H~mfJO12e3Q>~d>XmNSb?Q_bGeUD7BDo3+;9~+#Kq!dn$@LTeQr(Hcz zJy7TZ)4Eta>Xf;=^fE1Tf)3Y12FFH19;4x}4IxdW4Q2wf%&K!mq{4a?k3`ea8fYL{ zL?^oMd$dx-YSCX6eXHx~Gls^Gd#Ec5!=R7^HMPts9wRslyjxIEzW&E#)TXeTgX77Z z10g&|7P;s_JX$t~LcWgdMp+Dyhl4JRX+0k?$`5+1 z`w4pV1p8trH=@$s8QrCvAX2mpsuO*UiLLG|L^eOZt8xPe&| z3LMR&1dKi`n{wh=9(NnGbyqz%2Eq;b)g499P~hGwDAF=7uO&eEDNvDhV~?fo*bj!I zl(gMbOG~Q>!L-^OV2Fny>Gb6Wnd08J%9<&3?j%4{{i11>-PbDFWVIlWOWiljag9BP z!@`Ae39{#59kgW`eTudIy!lb`V|qv$9+7!%h}okUgx3bTPnn!tl(4aaNgJI?y7S`t zYNRNBR8bq*anTdKPcsU_+D437K2Q4PYA}$2P3Ce#H$A2onQDucw~imE3I=4LAO2kc zgo@};`|U#6sZnU20hj9*N2BTt@-Qs6E=oJ zy}_6d7#Qx|P*x=n6-ujwa>I(zVOot zLE4n)G3rIg+tn-ML1l2cm7~QN?oNeoi-2fq-IvvCSK1q9oYz~iqEx}dlg0wNef+C8 zQ!pfIlh$*KN|zpHQ&8ylDW|Vr#nDGlbu`SO%*=Jek+N!V<+?lXqW+IdI$>(vRMH&g z)mGbfJ8ZT*Yp}t9iXBXV*f3T~X6kO)4noH4m3wTLAIOqB56tLtO{32@;)rZ(17_%r zcSjP-QDzr` zTacc;p5AQ2emu&?Z@oYZbp(0KZ(O}XU&$GP=Nl#%iO|Qk&i$=cs6keEk8PlrUUtu& zTnfAkR~-mHXEBKkLm*f_lkVr(6mq*Mq=6=y=Maban`(S`ALAq$o}9eT`G%W|JCwLZ z`oj33O)m~=7F6OJt^^ZxO~D)yY8SNeFveLQi)SS@fR}vmh5Ew{tGUOmcj$p2KrFg! z$@ZVbDrpOEQwvw#i(#ghI*U$!g>EgT3ooxrB_`WB^0_7)EHJBcU3{4S;cQ&?GtL4t zK5gOvw~-pob*yE}+(tRSW68Czg{DsnA4h5!nJO;?X$0PrAyh!rOh|q)7Nm3CTKU9H zNZH~CMFPtkr%nQxP=aAkdUW=_xKXrG77TRE{q+zn`!@L6A>iblSp@M37BQn-#ul;~ z6Ev%_r;l=oUce>IRUlO6UnB(9`aq>xR*XDW>3SUm#xXxnq5%BBcH-BMu&{P=bNXsd<~^TU zTH$~4B~=K-sud%UpC0Bdc!<_K27OG~4bF96UZY5lrviv|n7VzH^Qd-Xc{JDpnovnK z6?lCaflDjGAAk>d?fn8Zq8Q{(DCgCmr(0>24gGp^KG>Jw3OLwiuwWoCET1`xr!_xe*f8^RtRI;ZVZFHq<*Gy#V@&Qzu5QyL&X zsCx>EqnnQ2NogI(9vNau;b=~3fF^>vaM({ zI(9n|I+#;i1c=7oH~Az-JKxB90z#i2F+%1kAxsMC+JP zmdz6u4DHrix^T8jL6#*ND&)~1U1U^$yoQ=-q*Mj<21#0~^Ej4P*0q_hl|_X~tlu*p zz|MF<(M6j7Dfh*tX3iaO&Sb_WX+2%uc$^t4hqoVy z{i=l{Z)%8#8`)fYQ_Um!jvB}u2;@)1;K`5AOqPq+0>HDN^9d#eEtnkMepx2JqL07h zev`ma)z)Wh!&@bdkK}^gnaQ}`KXILfmi+u3f!Hj>=PA>Mk7Mp~oAm3N#-p|B@GDLENf9fDqGd8w}3lw99`Gi+TkR`5Kovf%B+ih0DHPQ*xE+1oCh|DkJXhmFM2qAzvq^}AUS?}Fwp4(AkAWVT;Mt0p} z!&7pS%wuV5p2+_YC1;TA@CPk543W?fNs+NI+F()EFC-HBzI)VbqQjCp#af6Q{z~ zJ2Vaw4ifph#k#9_uE9l^go{si^zR|kTltIx<3{FjILPJINQah?uv$BfB0ar6=|rsw z^|2G(-EZ%g7C}-sa+;<2k{q7Yk9<%W0^w>2>oeo$3NhI7{SALT`y|U>)3mF#;`u5t zssua~?@|kRHRv1pl_~3W8PUbKbb+;~IKNC|&6dm;tQ-W(=>{aqG$TlEBF+cLh<}w^ zRmDzeB{qFn57vUO;P7?tcE$w2GQg&)!Zg%Yla&?NuuAX?KwxHUNX`ses@g;o)n6Tt zYF#&`D$?g#kK~q}=pB;`EJl*#H@{Y~C{YTTfH_BZ>uhO!SYqPRrYi&8ykkR_>}idq ziyOUOmR#D}b2J|)IYvjj3Y^pyb#1u#U=uo9Pv$Ha;us&CU6tQ;@qMI?(pn#$aMNsDH5zyoPqW_a zYnA1oN{+3cjeLChBIm4Ly}|Y34BJS?rj7)nFsGpxP$l6U7ov*dbJE2)+puYa#*AIu zH%QzM-(?tTncN-97YJs)B(EWa%T*q$i9BWVzTw3DPW6xL#>a2N?XOLUnawH7mDsf- zjBleQk)z6xa&KU!wC}PoC&4B$n^8-B z67N%yL(81ZOM?iLRWNtKnSSuX1Z7ED)=6!+E1tGDvt~9W6H07y!&Nh1L^CgsfwPH0 zDy<;GvTLTZByvD{Xf|D_E@o!#GMcHG+Y+=1l!#fm0wEBI6B9yyFd`}SU!{n+V;Wsx zyI+s6@GdyT*T{y)xeut zFYQGve)!uaHXPK4!+lzbk^kCbIWKpB)oQ8AkGA!!3jrM~QvrjNWatzJD)8t`6H^a#?*U*z|EgNuQX~($^84LrnM0x(fLml?Jp+w0!((^f-PnDpW|Vr~RDsu0 zf4QJk)lS6XZCS0oy97Cp|0JboMXM|sFQd2cQ}YDh&&uxa;()>x0W@@JezFS4LIM0F zoS_c+X`*K6mQsg57H#Q0Jtvl2!<|s9CSRoV$Qy81r(-j$1jJ)eV#%(mI5jxDc?9mpwFegH=--T+xKYwfmw6lB=3KWW)+Ki+I5CK8z2!vL^Za!XI}BAS zsH$_3zFihc2Mt@{&NHP%KKVjJssz%bD5Wn63r_- z7jp?U6$K&Jm}Q9$19B3d9uua|i>&Se-3H9xkYM(Di!E>vMRn@*KtIlq-r4g%^jzxz zdlh*D6pekSX|$o3tWl4>X#&rkN!}#Sjj#D3c8<}`sB&4Vo-9HPYa(}|yRWCd z#zz&fyJneO%Pp#~bO&vp(pKUU#K1saU=z`{jo0=pki*!_7UCR3iQ#OTHPsy+3k(ZW zm(U65iLTxbFfeCQ zzRsvYFqqRDXju_sqO8z~a^DiDf|3c_vZq`mD|X*J1u>IOdOYZvXLmUv@x5R4eBlEU zJ}hFU3e&U8De6=k04GlqYR6f=Pnco6>IacijY*i%Zvct~xbR!L?$qm5$ULp#NF!mH zRo>nvp>1728%#@|QO8ml!P3&}^D#kV`8_PmbUKUM;G=SNNXg}C_mHy*H47p}zU90= zmmbMu`AesEwYT)CB1QDYFhJQkTggq62iaePk`+o){JD1ku208a_?7p1Y$mRK7{G4) zXMRX7jDCF+f-EkeqLpWjI~yUFBLl_i9vS@fchqFJ zj~5DJEAO4~u`2^0xqFm_{zZ)}Q5hafz6w#MjmyrZe#*3QUsKX!ocwmdjp!aI7M!_kG>XT@3lH`kMYKE}(D%w~eL72@!$Dds#3>M7+D^-Bi9 z4)Wy&)xsDyP}Ws}+3+kG?gN0hQfV$=e*OTk%}gZyAG)&a{~x3*@)8>2!ZLrmvWov* zRrVj)jej{==;=A|IaoRVFYJx~YghI^oh+>Xj^6m+o3a9Qg8zhXi2M`3@h|v>>_71v zihm_7%6~O2s&r~}>i-kN@n2*u|4_sH1I+P{?XRrmAKO3p9M=B}(ea<=7Rx7b?z zRkzr>*ch5PI$4{&xn*|1`t=S2xT*YQc(7{{{o$__yc!A3b4qmVZ;j zFfwxd?H&K?)W54?7}?qA|DRzXiXQCAURZGBnJg5t-LekCrUPp;71Zl7@jf!ZI=V_CFXg#}%aG&GGV3av%RKUeVYV?Jbc^iFqgJ^y&zes=iHI_bSWic4kW zD9sHb=m_u-1{4B>^|Jur6oYCb`U~lAEi7;nBZv$jL7K^<$OHRVRSf~s*tzi|g7vE~ zCoeJUL)cpIhn-0f8Eo^A`&ZB0>m*R-hk#3{Ge-j8E1N*RwJSXRvgUIIn_VY`XNyq>aMJn?&uD0vI4&w)zX_3I7!XFq0C}u;=08bKG9%Va&Ds}C}z1I?Xk4Y51EC;QV6yh7;v%8oBOkXZ3b*g5F)Mj2{ zxu~O?+qN=#)>-3>NjydzBMihXrwKuFBSlLHs47}LDA}ky&C;S06N32TRrJ~!yjN5R zenz+UYW91eoMtUwn&w%gfDyJxs>W zvaKpuTC}o8Ean!sB~ut3B!bn*7HtcaovY$@&b&Tkr}_wa5RjOkD4#S+BkBl?tr_`p zxSiLQZV=u0S82?ecmnqPo(-Q2>j97p>SBgy+3Wf)~F8pjCFJiaf(BVnFwyf}jeRzXY^WT@0 zL|4(^7q%pex3chJ4(j_<6QM0II0@8(?lb-_X?ASqOcSa{#x#t&lkRTfJT>i1F7?yXBM=#*e)TIQG-I$P$S zbIrNO+vmuJhoPT~L&D&w(CA#*dFyE0&EHh>e~5Fti_z7KlU-g_kuBA03X5F%E=_M< zB4zuEOS4lZPDP)w!1{PH)|9%}4!auINIL^I^}?ud5jQ<}LO#N*CoZz(gPuh*dIG%b zt=>C5N;L1~6>ffinn)n2W|ovU_aSNIkXmui*pjc^<2-Fk(f&S^Nx;|bs}S*=() zn~iTF2Oa-Nr+s^$iJxQoT#I;kT{`AOB_|+V>5;vMvA$wJ>pJhF<@pNcny1H5SFV22 zqY-+%40&08drWKKQbmF!_wu3;XV{@YpHBL2`|^98yUyR@HSzhCP%eZh=ERBft|`6` z(hPY;yU1UkrN#HrfYl=f1omX;JDrxP)&cXjW-HP#-Wj%JcEqCoj$}jS{_q*NINYWp zAuYU!;5fGF2D6`A$SmX@s69`fPWdXBcCSS7lXa&e|DLNFPnbMI?fB|(%C^a9R@MRi zf_b7|@7ECP-oxelxX~J^ju6(ga1~y@OgvwZ-d|iIY#BrEyqa@uNzdxTfqp>cDMoR` zvQWiT&@oAK@jEv(mR~+j-qdmYr3#>1b{u2rGY}-zR*1yrVVt6bL3K=k^Ugrc2{sv7a|^Jug-huI;++9fxr_?Jh7$)}){Z$#U@(gck5UFlG$ zOmN5V_q!?z9iMHi*#(o*5vn@kseZdw$LiMbD;j6)bFRBj!PqdFJp)& @s0Lci#H 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

4Z^9Mu!0p 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\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. Also \fR for roman. +.\" pad: src: deputy man page .SH NAME spatch \- apply a semantic patch file to a set of C files diff --git a/engine/asttoctl2.ml b/engine/asttoctl2.ml index dd6e5a7..1c4d196 100644 --- a/engine/asttoctl2.ml +++ b/engine/asttoctl2.ml @@ -434,7 +434,7 @@ let contains_modif = let option_default = false in let mcode r (_,_,kind,metapos) = match kind with - Ast.MINUS(_,_) -> true + Ast.MINUS(_,_,_,_) -> true | Ast.PLUS -> failwith "not possible" | Ast.CONTEXT(_,info) -> not (info = Ast.NOTHING) in let do_nothing r k e = k e in @@ -531,7 +531,7 @@ let count_nested_braces s = let option_default = 0 in let stmt_count r k s = match Ast.unwrap s with - Ast.Seq(_,_,_,_) | Ast.FunDecl(_,_,_,_,_) -> (k s) + 1 + Ast.Seq(_,_,_) | Ast.FunDecl(_,_,_,_) -> (k s) + 1 | _ -> k s in let donothing r k e = k e in let mcode r x = 0 in @@ -635,12 +635,10 @@ and get_before_e s a = (match Ast.unwrap ast with Ast.MetaStmt(_,_,_,_) -> (s,[]) | _ -> (s,[Ast.Other s])) - | Ast.Seq(lbrace,decls,body,rbrace) -> + | Ast.Seq(lbrace,body,rbrace) -> let index = count_nested_braces s in - let (de,dea) = get_before decls [Ast.WParen(lbrace,index)] in - let (bd,_) = get_before body dea in - (Ast.rewrap s (Ast.Seq(lbrace,de,bd,rbrace)), - [Ast.WParen(rbrace,index)]) + let (bd,_) = get_before body [Ast.WParen(lbrace,index)] in + (Ast.rewrap s (Ast.Seq(lbrace,bd,rbrace)),[Ast.WParen(rbrace,index)]) | Ast.Define(header,body) -> let (body,_) = get_before body [] in (Ast.rewrap s (Ast.Define(header,body)), [Ast.Other s]) @@ -674,10 +672,9 @@ and get_before_e s a = | Ast.OptCase(case_line) -> failwith "not supported") cases in (Ast.rewrap s (Ast.Switch(header,lb,cases,rb)),[Ast.Other s]) - | Ast.FunDecl(header,lbrace,decls,body,rbrace) -> - let (de,dea) = get_before decls [] in - let (bd,_) = get_before body dea in - (Ast.rewrap s (Ast.FunDecl(header,lbrace,de,bd,rbrace)),[]) + | Ast.FunDecl(header,lbrace,body,rbrace) -> + let (bd,_) = get_before body [] in + (Ast.rewrap s (Ast.FunDecl(header,lbrace,bd,rbrace)),[]) | _ -> Pretty_print_cocci.statement "" s; Format.print_newline(); failwith "get_before_e: not supported" @@ -768,11 +765,10 @@ and get_after_e s a = (Ast.MetaStmt(nm,keep,Ast.SequencibleAfterDots a,i)))),[]) | Ast.MetaStmt(_,_,_,_) -> (s,[]) | _ -> (s,[Ast.Other s])) - | Ast.Seq(lbrace,decls,body,rbrace) -> + | Ast.Seq(lbrace,body,rbrace) -> let index = count_nested_braces s in - let (bd,bda) = get_after body [Ast.WParen(rbrace,index)] in - let (de,_) = get_after decls bda in - (Ast.rewrap s (Ast.Seq(lbrace,de,bd,rbrace)), + let (bd,_) = get_after body [Ast.WParen(rbrace,index)] in + (Ast.rewrap s (Ast.Seq(lbrace,bd,rbrace)), [Ast.WParen(lbrace,index)]) | Ast.Define(header,body) -> let (body,_) = get_after body a in @@ -807,10 +803,9 @@ and get_after_e s a = | Ast.OptCase(case_line) -> failwith "not supported") cases in (Ast.rewrap s (Ast.Switch(header,lb,cases,rb)),[Ast.Other s]) - | Ast.FunDecl(header,lbrace,decls,body,rbrace) -> - let (bd,bda) = get_after body [] in - let (de,_) = get_after decls bda in - (Ast.rewrap s (Ast.FunDecl(header,lbrace,de,bd,rbrace)),[]) + | Ast.FunDecl(header,lbrace,body,rbrace) -> + let (bd,_) = get_after body [] in + (Ast.rewrap s (Ast.FunDecl(header,lbrace,bd,rbrace)),[]) | _ -> failwith "get_after_e: not supported" let preprocess_dots sl = @@ -1156,19 +1151,19 @@ let svar_context_with_add_after stmt s label quantified d ast Ast.CONTEXT(pos,Ast.BEFOREAFTER(bef,_)) -> Ast.CONTEXT(pos,Ast.BEFORE(bef)) | Ast.CONTEXT(pos,_) -> Ast.CONTEXT(pos,Ast.NOTHING) - | Ast.MINUS(_,_) | Ast.PLUS -> failwith "not possible") in + | Ast.MINUS(_,_,_,_) | Ast.PLUS -> failwith "not possible") in let middle_metamatch = matcher (match d with Ast.CONTEXT(pos,_) -> Ast.CONTEXT(pos,Ast.NOTHING) - | Ast.MINUS(_,_) | Ast.PLUS -> failwith "not possible") in + | Ast.MINUS(_,_,_,_) | Ast.PLUS -> failwith "not possible") in let last_metamatch = matcher (match d with Ast.CONTEXT(pos,Ast.BEFOREAFTER(_,aft)) -> Ast.CONTEXT(pos,Ast.AFTER(aft)) | Ast.CONTEXT(_,_) -> d - | Ast.MINUS(_,_) | Ast.PLUS -> failwith "not possible") in + | Ast.MINUS(_,_,_,_) | Ast.PLUS -> failwith "not possible") in let rest_nodes = ctl_and CTL.NONSTRICT middle_metamatch prelabel_pred in @@ -1201,19 +1196,16 @@ let svar_minus_or_no_add_after stmt s label quantified d ast let prelabel_pred = CTL.Pred (Lib_engine.PrefixLabel(label_var),CTL.Control) in let matcher d = make_match None guard (make_meta_rule_elem d fvinfo) in - let pure_d = + let ender = + match (d,after) with + (Ast.CONTEXT(pos,Ast.NOTHING),(Tail|End|VeryEnd)) -> + (* just match the root. don't care about label; always ok *) + make_raw_match None false ast + | (Ast.MINUS(pos,inst,adj,[]),(Tail|End|VeryEnd)) -> (* don't have to put anything before the beginning, so don't have to distinguish the first node. so don't have to bother about paths, just use the label. label ensures that found nodes match up with what they should because it is in the lhs of the andany. *) - match d with - Ast.MINUS(pos,[]) -> true - | Ast.CONTEXT(pos,Ast.NOTHING) -> true - | _ -> false in - let ender = - match (pure_d,after) with - (true,Tail) | (true,End) | (true,VeryEnd) -> - (* the label sharing makes it safe to use AndAny *) CTL.HackForStmt(CTL.FORWARD,CTL.NONSTRICT, ctl_and CTL.NONSTRICT label_pred (make_raw_match label false ast), @@ -1224,7 +1216,7 @@ let svar_minus_or_no_add_after stmt s label quantified d ast let rest_metamatch = matcher (match d with - Ast.MINUS(pos,_) -> Ast.MINUS(pos,[]) + Ast.MINUS(pos,inst,adj,_) -> Ast.MINUS(pos,inst,adj,[]) | Ast.CONTEXT(pos,_) -> Ast.CONTEXT(pos,Ast.NOTHING) | Ast.PLUS -> failwith "not possible") in let rest_nodes = ctl_and CTL.NONSTRICT rest_metamatch prelabel_pred in @@ -1605,17 +1597,19 @@ and statement stmt after quantified minus_quantified is absent *) let new_mc = match (retmc,semmc) with - (Ast.MINUS(_,l1),Ast.MINUS(_,l2)) when !Flag.sgrep_mode2 -> + (Ast.MINUS(_,inst1,adj1,l1),Ast.MINUS(_,_,_,l2)) + when !Flag.sgrep_mode2 -> (* in sgrep mode, we can propagate the - *) - Some (Ast.MINUS(Ast.NoPos,l1@l2)) - | (Ast.MINUS(_,l1),Ast.MINUS(_,l2)) + Some (Ast.MINUS(Ast.NoPos,inst1,adj1,l1@l2)) + | (Ast.MINUS(_,_,_,l1),Ast.MINUS(_,_,_,l2)) | (Ast.CONTEXT(_,Ast.BEFORE(l1)), Ast.CONTEXT(_,Ast.AFTER(l2))) -> Some (Ast.CONTEXT(Ast.NoPos,Ast.BEFORE(l1@l2))) | (Ast.CONTEXT(_,Ast.BEFORE(_)),Ast.CONTEXT(_,Ast.NOTHING)) | (Ast.CONTEXT(_,Ast.NOTHING),Ast.CONTEXT(_,Ast.NOTHING)) -> Some retmc - | (Ast.CONTEXT(_,Ast.NOTHING),Ast.CONTEXT(_,Ast.AFTER(l))) -> + | (Ast.CONTEXT(_,Ast.NOTHING), + Ast.CONTEXT(_,Ast.AFTER(l))) -> Some (Ast.CONTEXT(Ast.NoPos,Ast.BEFORE(l))) | _ -> None in let ret = Ast.make_mcode "return" in @@ -1660,24 +1654,24 @@ and statement stmt after quantified minus_quantified quantified minus_quantified label llabel slabel guard in dots_done := true; make_seq_after term after) - | Ast.Seq(lbrace,decls,body,rbrace) -> - let (lbfvs,b1fvs,b2fvs,b3fvs,rbfvs) = + | Ast.Seq(lbrace,body,rbrace) -> + let (lbfvs,b1fvs,b2fvs,rbfvs) = match seq_fvs quantified - [Ast.get_fvs lbrace;Ast.get_fvs decls; + [Ast.get_fvs lbrace; Ast.get_fvs body;Ast.get_fvs rbrace] with - [(lbfvs,b1fvs);(_,b2fvs);(_,b3fvs);(rbfvs,_)] -> - (lbfvs,b1fvs,b2fvs,b3fvs,rbfvs) + [(lbfvs,b1fvs);(_,b2fvs);(rbfvs,_)] -> + (lbfvs,b1fvs,b2fvs,rbfvs) | _ -> failwith "not possible" in - let (mlbfvs,mb1fvs,mb2fvs,mb3fvs,mrbfvs) = + let (mlbfvs,mb1fvs,mb2fvs,mrbfvs) = match seq_fvs minus_quantified - [Ast.get_mfvs lbrace;Ast.get_mfvs decls; + [Ast.get_mfvs lbrace; Ast.get_mfvs body;Ast.get_mfvs rbrace] with - [(lbfvs,b1fvs);(_,b2fvs);(_,b3fvs);(rbfvs,_)] -> - (lbfvs,b1fvs,b2fvs,b3fvs,rbfvs) + [(lbfvs,b1fvs);(_,b2fvs);(rbfvs,_)] -> + (lbfvs,b1fvs,b2fvs,rbfvs) | _ -> failwith "not possible" in let pv = count_nested_braces stmt in let lv = get_label_ctr() in @@ -1701,26 +1695,17 @@ and statement stmt after quantified minus_quantified paren_pred)) in let new_quantified2 = Common.union_set b1fvs (Common.union_set b2fvs quantified) in - let new_quantified3 = Common.union_set b3fvs new_quantified2 in let new_mquantified2 = Common.union_set mb1fvs (Common.union_set mb2fvs minus_quantified) in - let new_mquantified3 = Common.union_set mb3fvs new_mquantified2 in let pattern_as_given = let new_quantified2 = Common.union_set [pv] new_quantified2 in - let new_quantified3 = Common.union_set [pv] new_quantified3 in quantify true [pv;lv] (quantify guard b1fvs (make_seq [start_brace; quantify guard b2fvs - (statement_list decls - (After - (quantify guard b3fvs - (statement_list body - (After (make_seq_after end_brace after)) - new_quantified3 new_mquantified3 - (Some (lv,ref true)) (* label mostly useful *) - llabel slabel true guard))) + (statement_list body + (After (make_seq_after end_brace after)) new_quantified2 new_mquantified2 (Some (lv,ref true)) llabel slabel false guard)])) in if ends_in_return body @@ -1742,13 +1727,12 @@ and statement stmt after quantified minus_quantified ctl_au (make_match empty_rbrace) (ctl_ax (* skip the destination label *) - (quantify guard b3fvs + (quantify guard b2fvs (statement_list body End - new_quantified3 new_mquantified3 None llabel slabel + new_quantified2 new_mquantified2 None llabel slabel true guard)))] in let pattern3 = let new_quantified2 = Common.union_set [pv] new_quantified2 in - let new_quantified3 = Common.union_set [pv] new_quantified3 in quantify true [pv;lv] (quantify guard b1fvs (make_seq @@ -1762,23 +1746,11 @@ and statement stmt after quantified minus_quantified (* want AF even for sgrep *) (CTL.AF(CTL.FORWARD,CTL.STRICT,end_brace)))) (quantify guard b2fvs - (statement_list decls - (After - (quantify guard b3fvs - (statement_list body Tail - (*After - (make_seq_after - nopv_end_brace after)*) - new_quantified3 new_mquantified3 - None llabel slabel true guard))) + (statement_list body Tail new_quantified2 new_mquantified2 (Some (lv,ref true)) llabel slabel false guard))])) in - ctl_or pattern_as_given - (match Ast.unwrap decls with - Ast.DOTS([]) -> ctl_or pattern2 pattern3 - | Ast.DOTS(l) -> pattern3 - | _ -> failwith "circles and stars not supported") + ctl_or pattern_as_given (ctl_or pattern2 pattern3) else pattern_as_given | Ast.IfThen(ifheader,branch,aft) -> ifthen ifheader branch aft after quantified minus_quantified @@ -1836,7 +1808,7 @@ and statement stmt after quantified minus_quantified | Ast.Dots((_,i,d,_),whencodes,bef,aft) -> let dot_code = match d with - Ast.MINUS(_,_) -> + Ast.MINUS(_,_,_,_) -> (* no need for the fresh metavar, but ... is a bit weird as a variable name *) Some(make_match (make_meta_rule_elem d ([],[],[]))) @@ -2005,24 +1977,24 @@ and statement stmt after quantified minus_quantified wrapper (end_control_structure b1fvs switch_header body after_pred (Some(ctl_ex after_pred)) None aft after label guard) - | Ast.FunDecl(header,lbrace,decls,body,rbrace) -> - let (hfvs,b1fvs,lbfvs,b2fvs,b3fvs,b4fvs,rbfvs) = + | Ast.FunDecl(header,lbrace,body,rbrace) -> + let (hfvs,b1fvs,lbfvs,b2fvs,b3fvs,rbfvs) = match seq_fvs quantified - [Ast.get_fvs header;Ast.get_fvs lbrace;Ast.get_fvs decls; + [Ast.get_fvs header;Ast.get_fvs lbrace; Ast.get_fvs body;Ast.get_fvs rbrace] with - [(hfvs,b1fvs);(lbfvs,b2fvs);(_,b3fvs);(_,b4fvs);(rbfvs,_)] -> - (hfvs,b1fvs,lbfvs,b2fvs,b3fvs,b4fvs,rbfvs) + [(hfvs,b1fvs);(lbfvs,b2fvs);(_,b3fvs);(rbfvs,_)] -> + (hfvs,b1fvs,lbfvs,b2fvs,b3fvs,rbfvs) | _ -> failwith "not possible" in - let (mhfvs,mb1fvs,mlbfvs,mb2fvs,mb3fvs,mb4fvs,mrbfvs) = + let (mhfvs,mb1fvs,mlbfvs,mb2fvs,mb3fvs,mrbfvs) = match seq_fvs quantified - [Ast.get_mfvs header;Ast.get_mfvs lbrace;Ast.get_mfvs decls; + [Ast.get_mfvs header;Ast.get_mfvs lbrace; Ast.get_mfvs body;Ast.get_mfvs rbrace] with - [(hfvs,b1fvs);(lbfvs,b2fvs);(_,b3fvs);(_,b4fvs);(rbfvs,_)] -> - (hfvs,b1fvs,lbfvs,b2fvs,b3fvs,b4fvs,rbfvs) + [(hfvs,b1fvs);(lbfvs,b2fvs);(_,b3fvs);(rbfvs,_)] -> + (hfvs,b1fvs,lbfvs,b2fvs,b3fvs,rbfvs) | _ -> failwith "not possible" in let function_header = quantify guard hfvs (make_match header) in let start_brace = quantify guard lbfvs (make_match lbrace) in @@ -2046,16 +2018,14 @@ and statement stmt after quantified minus_quantified let new_quantified3 = Common.union_set b1fvs (Common.union_set b2fvs (Common.union_set b3fvs quantified)) in - let new_quantified4 = Common.union_set b4fvs new_quantified3 in let new_mquantified3 = Common.union_set mb1fvs (Common.union_set mb2fvs (Common.union_set mb3fvs minus_quantified)) in - let new_mquantified4 = Common.union_set mb4fvs new_mquantified3 in let fn_nest = - match (Ast.undots decls,Ast.undots body, + match (Ast.undots body, contains_modif rbrace or contains_pos rbrace) with - ([],[body],false) -> + ([body],false) -> (match Ast.unwrap body with Ast.Nest(stmt_dots,[],multi,_,_) -> if multi @@ -2081,7 +2051,7 @@ and statement stmt after quantified minus_quantified statement_list stmt_dots (* discards match on right brace, but don't need it *) (Guard (make_seq_after end_brace after)) - new_quantified4 new_mquantified4 + new_quantified3 new_mquantified3 None llabel slabel true guard) | Some (Common.Right whencode) -> (* try to be more efficient for the case where the body is just @@ -2102,7 +2072,7 @@ and statement stmt after quantified minus_quantified | Ast.WhenNot(sl) -> let x = statement_list sl Tail - new_quantified4 new_mquantified4 + new_quantified3 new_mquantified3 label llabel slabel true true in ctl_or prev x | Ast.WhenNotTrue(_) | Ast.WhenNotFalse(_) -> @@ -2116,7 +2086,7 @@ and statement stmt after quantified minus_quantified Ast.WhenAlways(s) -> let x = statement s Tail - new_quantified4 new_mquantified4 + new_quantified3 new_mquantified3 label llabel slabel true in ctl_and prev x | Ast.WhenNot(sl) -> prev @@ -2130,13 +2100,8 @@ and statement stmt after quantified minus_quantified make_seq [start_brace; quantify guard b3fvs - (statement_list decls - (After - (quantify guard b4fvs - (statement_list body - (After (make_seq_after end_brace after)) - new_quantified4 new_mquantified4 - None llabel slabel true guard))) + (statement_list body + (After (make_seq_after end_brace after)) new_quantified3 new_mquantified3 None llabel slabel false guard)] in quantify guard b1fvs diff --git a/engine/asttomember.ml b/engine/asttomember.ml index acfa8e8..b5ef902 100644 --- a/engine/asttomember.ml +++ b/engine/asttomember.ml @@ -29,7 +29,7 @@ module CTL = Ast_ctl let mcode r (_,_,kind,_) = match kind with - Ast.MINUS(_,_) -> true + Ast.MINUS(_,_,_,_) -> true | Ast.PLUS -> failwith "not possible" | Ast.CONTEXT(_,info) -> not (info = Ast.NOTHING) @@ -183,11 +183,8 @@ and statement testfn mcode tail stmt : 'a list list = (* modifications on return are managed in some other way *) Ast.Return(_,_) | Ast.ReturnExpr(_,_,_) when tail -> [] | _ -> if testfn ast then rule_elem ast else []) - | Ast.Seq(lbrace,decls,body,rbrace) -> - let body_info = - conj - (statement_list testfn mcode false decls) - (statement_list testfn mcode tail body) in + | Ast.Seq(lbrace,body,rbrace) -> + let body_info = statement_list testfn mcode tail body in if testfn lbrace or testfn rbrace then conj_wrapped [lbrace;rbrace] body_info else body_info @@ -230,11 +227,8 @@ and statement testfn mcode tail stmt : 'a list list = | Ast.Dots(_,whencodes,_,_) -> [] - | Ast.FunDecl(header,lbrace,decls,body,rbrace) -> - let body_info = - conj - (statement_list testfn mcode false decls) - (statement_list testfn mcode true body) in + | Ast.FunDecl(header,lbrace,body,rbrace) -> + let body_info = statement_list testfn mcode true body in if testfn header or testfn lbrace or testfn rbrace then conj (rule_elem header) body_info else body_info diff --git a/engine/c_vs_c.ml b/engine/c_vs_c.ml index 3f2e7e9..3bb9e77 100644 --- a/engine/c_vs_c.ml +++ b/engine/c_vs_c.ml @@ -217,11 +217,12 @@ and typeC tya tyb = (sua =*= sub && saopt =*= sbopt && List.length sta =|= List.length stb) >&&> Common.zip sta stb +> List.fold_left - (fun acc ((xfielda, iia), (xfieldb, iib)) -> - let iix = iia in + (fun acc ((fielda), (fieldb)) -> acc >>= (fun xs -> - match xfielda, xfieldb with - | EmptyField, EmptyField -> return ((EmptyField, iix)::xs) + match fielda, fieldb with + | EmptyField iia, EmptyField iib -> + let iix = iia in + return ((EmptyField iix)::xs) | DeclarationField (FieldDeclList (fa, iipta)), DeclarationField (FieldDeclList (fb, iiptb)) -> @@ -253,7 +254,7 @@ and typeC tya tyb = ) (return []) >>= (fun fx -> return (((DeclarationField - (FieldDeclList (List.rev fx,iipt))), iix)::xs) + (FieldDeclList (List.rev fx,iipt))))::xs) ) | _ -> fail ) diff --git a/engine/cocci_vs_c.ml b/engine/cocci_vs_c.ml index dd17d4b..e50003c 100644 --- a/engine/cocci_vs_c.ml +++ b/engine/cocci_vs_c.ml @@ -30,6 +30,7 @@ module Flag = Flag_matcher (*****************************************************************************) (* Wrappers *) (*****************************************************************************) +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_matcher.verbose_matcher (*****************************************************************************) (* Helpers *) @@ -91,12 +92,12 @@ let mcodekind mc = A.get_mcodekind mc let mcode_contain_plus = function | A.CONTEXT (_,A.NOTHING) -> false | A.CONTEXT _ -> true - | A.MINUS (_,[]) -> false - | A.MINUS (_,x::xs) -> true + | A.MINUS (_,_,_,[]) -> false + | A.MINUS (_,_,_,x::xs) -> true | A.PLUS -> raise Impossible let mcode_simple_minus = function - | A.MINUS (_,[]) -> true + | A.MINUS (_,_,_,[]) -> true | _ -> false @@ -110,8 +111,8 @@ let mcode_simple_minus = function let minusizer = ("fake","fake"), - {A.line = 0; column =0; A.strbef=[]; A.straft=[];}, - (A.MINUS(A.DontCarePos, [])), + {A.line = 0; A.column =0; A.strbef=[]; A.straft=[];}, + (A.MINUS(A.DontCarePos,[],-1,[])), A.NoMetaPos let generalize_mcode ia = @@ -121,11 +122,11 @@ let generalize_mcode ia = | A.PLUS -> raise Impossible | A.CONTEXT (A.NoPos,x) -> A.CONTEXT (A.DontCarePos,x) - | A.MINUS (A.NoPos,x) -> - A.MINUS (A.DontCarePos,x) + | A.MINUS (A.NoPos,inst,adj,x) -> + A.MINUS (A.DontCarePos,inst,adj,x) | A.CONTEXT ((A.FixPos _|A.DontCarePos), _) - | A.MINUS ((A.FixPos _|A.DontCarePos), _) + | A.MINUS ((A.FixPos _|A.DontCarePos), _, _, _) -> raise Impossible in @@ -448,10 +449,14 @@ let initialisation_to_affectation decl = ref (Some ((Lib_parsing_c.al_type returnType),local), Ast_c.NotTest) in let ident = name in - let idexpr = (B.Ident (ident), typ),Ast_c.noii in - F.DefineExpr - ((B.Assignment (idexpr, B.SimpleAssign, e), - Ast_c.noType()), [iini]) + let idexpr = + Ast_c.mk_e_bis (B.Ident (ident)) typ Ast_c.noii + in + let assign = + Ast_c.mk_e + (B.Assignment (idexpr,B.SimpleAssign, e)) [iini] in + F.DefineExpr assign + | _ -> F.Decl decl ) | _ -> F.Decl decl @@ -762,7 +767,7 @@ let rec (expression: (A.expression, Ast_c.expression) matcher) = )) in (match term ia1, ib with - | A.Int x, B.Int y -> + | A.Int x, B.Int (y,_) -> X.value_format_flag (fun use_value_equivalence -> if use_value_equivalence then @@ -1082,10 +1087,9 @@ let rec (expression: (A.expression, Ast_c.expression) matcher) = - (* ------------------------------------------------------------------------- *) and (ident_cpp: info_ident -> (A.ident, B.name) matcher) = - fun infoidb ida idb -> + fun infoidb ida idb -> match idb with | B.RegularName (s, iis) -> let iis = tuple_of_list1 iis in @@ -1095,7 +1099,11 @@ and (ident_cpp: info_ident -> (A.ident, B.name) matcher) = (B.RegularName (s, [iis])) )) | B.CppConcatenatedName _ | B.CppVariadicName _ |B.CppIdentBuilder _ - -> raise Todo + -> + (* This should be moved to the Id case of ident. Metavariables + should be allowed to be bound to such variables. But doing so + would require implementing an appropriate distr function *) + fail and (ident: info_ident -> (A.ident, string * Ast_c.info) matcher) = fun infoidb ida ((idb, iib) as ib) -> @@ -1663,7 +1671,7 @@ and (declaration: (A.mcodekind * bool * A.declaration,B.declaration) matcher) = [iisb;lpb;rpb;iiendb;iifakestart] ++ iistob)) )))))))) - | _, (B.MacroDecl _ |B.DeclList _) -> fail + | _, (B.MacroDecl _ |B.DeclList _) -> fail @@ -2229,9 +2237,8 @@ and (struct_fields: (A.declaration list, B.field list) matcher) = ) and (struct_field: (A.declaration, B.field) matcher) = fun fa fb -> - let (xfield, iifield) = fb in - match xfield with + match fb with | B.DeclarationField (B.FieldDeclList (onefield_multivars,iiptvirg)) -> let iiptvirgb = tuple_of_list1 iiptvirg in @@ -2276,8 +2283,8 @@ and (struct_field: (A.declaration, B.field) matcher) = fun fa fb -> return ( (fa), ((B.DeclarationField - (B.FieldDeclList ([onevar, iivirg], [iiptvirgb]))), - iifield) + (B.FieldDeclList ([onevar, iivirg], [iiptvirgb]))) + ) ) | _ -> raise Impossible ) @@ -2287,11 +2294,12 @@ and (struct_field: (A.declaration, B.field) matcher) = fun fa fb -> pr2_once "PB: More that one variable in decl. Have to split"; fail ) - | B.EmptyField -> - let _iiptvirgb = tuple_of_list1 iifield in + | B.EmptyField _iifield -> fail - | B.MacroStructDeclTodo -> fail + | B.MacroDeclField _ -> + raise Todo + | B.CppDirectiveStruct directive -> fail | B.IfdefStruct directive -> fail diff --git a/engine/ctlcocci_integration.ml b/engine/ctlcocci_integration.ml index c9c3d02..e4c83b0 100644 --- a/engine/ctlcocci_integration.ml +++ b/engine/ctlcocci_integration.ml @@ -380,19 +380,22 @@ let metavars_binding_to_binding2 binding = let (satbis_to_trans_info: - (nodei * Lib_engine.metavars_binding2 * Lib_engine.predicate) list -> - (nodei * Lib_engine.metavars_binding * Ast_cocci.rule_elem) list) = + (int list * + (nodei * Lib_engine.metavars_binding2 * Lib_engine.predicate)) list -> + (int list * + (nodei * Lib_engine.metavars_binding * Ast_cocci.rule_elem)) list) = fun xs -> - xs +> List.fold_left (fun prev (nodei, binding2, pred) -> - match pred with - | Lib_engine.Match (rule_elem) -> - if !Flag.track_iso_usage then show_isos rule_elem; - (nodei, metavars_binding2_to_binding binding2, rule_elem) - ::prev + xs +> List.fold_left (fun prev (index,(nodei, binding2, pred)) -> + match pred with + | Lib_engine.Match (rule_elem) -> + if !Flag.track_iso_usage then show_isos rule_elem; + (index, + (nodei, metavars_binding2_to_binding binding2, rule_elem)) + ::prev (* see BindGood in asttotctl2 *) - | Lib_engine.BindGood (_) -> prev - | _ -> raise Impossible - ) [] + | Lib_engine.BindGood (_) -> prev + | _ -> raise Impossible + ) [] (*****************************************************************************) @@ -418,8 +421,8 @@ let (mysat2: Lib_engine.model -> (Lib_engine.ctlcocci * (pred list list)) -> (Lib_engine.mvar list*Lib_engine.metavars_binding) -> - (Lib_engine.transformation_info * bool * Lib_engine.metavars_binding * - Lib_engine.metavars_binding list)) = + (Lib_engine.numbered_transformation_info * bool * + Lib_engine.metavars_binding * Lib_engine.metavars_binding list)) = fun (flow, label, states) ctl (used_after, binding) -> let binding2 = metavars_binding_to_binding2 binding in let (triples,(trans_info2, returned_any_states, used_after_envs)) = diff --git a/engine/ctlcocci_integration.mli b/engine/ctlcocci_integration.mli index 593bca6..f515e06 100644 --- a/engine/ctlcocci_integration.mli +++ b/engine/ctlcocci_integration.mli @@ -19,8 +19,8 @@ val mysat : Lib_engine.model -> (Lib_engine.ctlcocci * (pred list list)) -> (Lib_engine.mvar list * Lib_engine.metavars_binding) -> - (Lib_engine.transformation_info * bool * Lib_engine.metavars_binding * - Lib_engine.metavars_binding list) + (Lib_engine.numbered_transformation_info * bool * + Lib_engine.metavars_binding * Lib_engine.metavars_binding list) val print_bench : unit -> unit diff --git a/engine/flag_matcher.ml b/engine/flag_matcher.ml index 887be68..9bcb3f4 100644 --- a/engine/flag_matcher.ml +++ b/engine/flag_matcher.ml @@ -21,6 +21,8 @@ let debug_engine = ref false +let verbose_matcher = ref true + (* false = simpler formulas, only for debugging *) let useEU = ref true @@ -34,3 +36,7 @@ let only_return_is_error_exit = ref false let allow_inconsistent_paths = ref false let show_misc = ref true + + +let show_transinfo = ref false + diff --git a/engine/lib_engine.ml b/engine/lib_engine.ml index 859844e..54647b8 100644 --- a/engine/lib_engine.ml +++ b/engine/lib_engine.ml @@ -77,6 +77,9 @@ type model = Control_flow_c.cflow * label_ctlcocci * nodei list type transformation_info = (nodei * metavars_binding * Ast_cocci.rule_elem) list +type numbered_transformation_info = + (int list * (nodei * metavars_binding * Ast_cocci.rule_elem)) list + (*****************************************************************************) (* comparing binding *) diff --git a/engine/pattern_c.ml b/engine/pattern_c.ml index 32d69d4..78dfb46 100644 --- a/engine/pattern_c.ml +++ b/engine/pattern_c.ml @@ -250,9 +250,9 @@ module XMATCH = struct | Ast_cocci.CONTEXT (pos, xs) -> assert (pos =*= Ast_cocci.NoPos || pos =*= Ast_cocci.DontCarePos); Ast_cocci.CONTEXT (posmck, xs) - | Ast_cocci.MINUS (pos, xs) -> + | Ast_cocci.MINUS (pos, inst, adj, xs) -> assert (pos =*= Ast_cocci.NoPos || pos =*= Ast_cocci.DontCarePos); - Ast_cocci.MINUS (posmck, xs) + Ast_cocci.MINUS (posmck, inst, adj, xs) let tag_mck_pos_mcode (x,info,mck,pos) posmck stuff = fun tin -> diff --git a/engine/postprocess_transinfo.ml b/engine/postprocess_transinfo.ml index 0d07454..1a66f31 100644 --- a/engine/postprocess_transinfo.ml +++ b/engine/postprocess_transinfo.ml @@ -105,11 +105,29 @@ let process_tree inherited_env l = let collect_used_after used_after envs = List.map (List.filter (function (v,vl) -> List.mem v used_after)) envs +(* ----------------------------------------------------------------------- *) +(* distinguish between distinct witness trees, each gets an index n *) + +let numberify trees = + let trees = + Common.fold_left_with_index + (function acc -> function xs -> function n -> + (List.map (function x -> (n,x)) xs) @ acc) + [] trees in + List.fold_left + (function res -> + function (n,x) -> + let (same,diff) = List.partition (function (ns,xs) -> x = xs) res in + match same with + [(ns,xs)] -> (n::ns,xs)::diff + | _ -> ([n],x)::res) + [] trees + (* ----------------------------------------------------------------------- *) (* entry point *) let process used_after inherited_env l = - extra_counter := 0; let (trees, fresh_envs) = List.split (List.map (process_tree inherited_env) l) in - (Common.uniq(List.concat trees), collect_used_after used_after fresh_envs) + let trees = numberify trees in + (trees, collect_used_after used_after fresh_envs) diff --git a/engine/postprocess_transinfo.mli b/engine/postprocess_transinfo.mli index 8fa8506..e45a8d6 100644 --- a/engine/postprocess_transinfo.mli +++ b/engine/postprocess_transinfo.mli @@ -5,7 +5,9 @@ val process : (Ograph_extended.nodei * (Ast_cocci.meta_name * Lib_engine.metavar_binding_kind2) list * Lib_engine.predicate) list list -> - (Ograph_extended.nodei * - (Ast_cocci.meta_name * Lib_engine.metavar_binding_kind2) list * - Lib_engine.predicate) list * + (int list * + (Ograph_extended.nodei * + (Ast_cocci.meta_name * Lib_engine.metavar_binding_kind2) + list * + Lib_engine.predicate)) list * (Ast_cocci.meta_name * Lib_engine.metavar_binding_kind2) list list diff --git a/engine/sgrep.ml b/engine/sgrep.ml index ed6dd49..d18659e 100644 --- a/engine/sgrep.ml +++ b/engine/sgrep.ml @@ -54,23 +54,23 @@ let process_sgrep ii mck = let col = Ast_c.col_of_info ii in let str = Ast_c.str_of_info ii in match mck with - Ast_cocci.MINUS(pos,repl) -> + Ast_cocci.MINUS(pos,inst,adj,repl) -> (match extract_sgrep_marker repl with (NoMark,_) -> mck | (BefMark(marker),repl) -> Printf.printf "Match on line %s starting at %s: line %d offset %d\n" marker file line col; - Ast_cocci.MINUS(pos,repl) + Ast_cocci.MINUS(pos,inst,adj,repl) | (AftMark(marker),repl) -> Printf.printf "Match on line %s ending at %s: line %d offset %d\n" marker file line (col + String.length str); - Ast_cocci.MINUS(pos,repl) + Ast_cocci.MINUS(pos,inst,adj,repl) | (BefAftMark(bmarker,amarker),repl) -> Printf.printf "Match on line %s starting at %s: line %d offset %d\n" bmarker file line col; Printf.printf "Match on line %s ending at %s: line %d offset %d\n" amarker file line (col + String.length str); - Ast_cocci.MINUS(pos,repl)) + Ast_cocci.MINUS(pos,inst,adj,repl)) | Ast_cocci.CONTEXT(pos,Ast_cocci.NOTHING) -> mck | Ast_cocci.CONTEXT(pos,Ast_cocci.BEFORE(bef)) -> (match extract_sgrep_marker bef with @@ -132,7 +132,8 @@ let process_sgrep ii mck = Printf.printf "Match on line %s starting at %s: line %d offset %d\n" marker file line col; (match extract_sgrep_marker aft with - (NoMark,_) -> Ast_cocci.CONTEXT(pos,Ast_cocci.BEFOREAFTER(bef,aft)) + (NoMark,_) -> + Ast_cocci.CONTEXT(pos,Ast_cocci.BEFOREAFTER(bef,aft)) | (AftMark(marker),[]) -> Printf.printf "Match on line %s ending at %s: line %d offset %d\n" diff --git a/engine/transformation_c.ml b/engine/transformation_c.ml index 2e1077f..6bcdb17 100644 --- a/engine/transformation_c.ml +++ b/engine/transformation_c.ml @@ -34,6 +34,7 @@ type xinfo = { optional_qualifier_iso : bool; value_format_iso : bool; current_rule_name : string; (* used for errors *) + index : int list (* witness tree indices *) } module XTRANS = struct @@ -164,11 +165,11 @@ module XTRANS = struct let check_pos info mck pos = match mck with | Ast_cocci.PLUS -> raise Impossible - | Ast_cocci.CONTEXT (Ast_cocci.FixPos (i1,i2),_) - | Ast_cocci.MINUS (Ast_cocci.FixPos (i1,i2),_) -> + | Ast_cocci.CONTEXT (Ast_cocci.FixPos (i1,i2),_) + | Ast_cocci.MINUS (Ast_cocci.FixPos (i1,i2),_,_,_) -> pos <= i2 && pos >= i1 - | Ast_cocci.CONTEXT (Ast_cocci.DontCarePos,_) - | Ast_cocci.MINUS (Ast_cocci.DontCarePos,_) -> + | Ast_cocci.CONTEXT (Ast_cocci.DontCarePos,_) + | Ast_cocci.MINUS (Ast_cocci.DontCarePos,_,_,_) -> true | _ -> match info with @@ -184,7 +185,7 @@ module XTRANS = struct let tag_with_mck mck ib = fun tin -> let cocciinforef = ib.Ast_c.cocci_tag in - let (oldmcode, oldenv) = !cocciinforef in + let (oldmcode, oldenv) = Ast_c.mcode_and_env_of_cocciref cocciinforef in let mck = (* coccionly: @@ -202,41 +203,69 @@ module XTRANS = struct ); match (oldmcode,mck) with - | (Ast_cocci.CONTEXT(_,Ast_cocci.NOTHING), _) + | (Ast_cocci.CONTEXT(_,Ast_cocci.NOTHING), _) | (_, Ast_cocci.CONTEXT(_,Ast_cocci.NOTHING)) -> - cocciinforef := (mck, tin.binding); + let update_inst inst = function + Ast_cocci.MINUS (pos,_,adj,any_xxs) -> + Ast_cocci.MINUS (pos,inst,adj,any_xxs) + | mck -> mck in + cocciinforef := Some (update_inst tin.extra.index mck, tin.binding); ib + | (Ast_cocci.MINUS(old_pos,old_inst,old_adj,[]), + Ast_cocci.MINUS(new_pos,new_inst,new_adj,[])) + when old_pos = new_pos && oldenv =*= tin.binding + (* no way to combine adjacency information, just drop one *) + -> + cocciinforef := Some + (Ast_cocci.MINUS + (old_pos,Common.union_set old_inst new_inst,old_adj,[]), + tin.binding); + (if !Flag_matcher.show_misc + then pr2 "already tagged but only removed, so safe"); + ib + | _ -> - if (oldmcode, oldenv) =*= (mck, tin.binding) - then begin - if !Flag_matcher.show_misc - then pr2 "already tagged but with same mcode, so safe"; - ib - end - else (* coccionly: if !Flag.sgrep_mode2 then ib (* safe *) else *) begin - (* coccionly: - Format.set_formatter_out_channel stderr; - Common.pr2 "SP mcode "; - Pretty_print_cocci.print_mcodekind oldmcode; - Format.print_newline(); - Common.pr2 "C code mcode "; - Pretty_print_cocci.print_mcodekind mck; - Format.print_newline(); - Format.print_flush(); - *) - failwith + (* coccionly: + pad: if dont want cocci write: + failwith (match Ast_c.pinfo_of_info ib with Ast_c.FakeTok _ -> "already tagged fake token" + *) + let pm str mcode env = + Printf.sprintf + "%s modification:\n%s\nAccording to environment:\n%s\n" + str + (Common.format_to_string + (function _ -> + Pretty_print_cocci.print_mcodekind mcode)) + (String.concat "\n" + (List.map + (function ((r,vr),vl) -> + Printf.sprintf " %s.%s -> %s" r vr + (Common.format_to_string + (function _ -> + Pretty_print_engine.pp_binding_kind vl))) + env)) in + flush stdout; flush stderr; + Common.pr2 + ("\n"^ (pm "previous" oldmcode oldenv) ^ "\n" ^ + (pm "current" mck tin.binding)); + failwith + (match Ast_c.pinfo_of_info ib with + Ast_c.FakeTok _ -> + Common.sprintf "%s: already tagged fake token\n" + tin.extra.current_rule_name | _ -> - Common.sprintf "%s: already tagged token:\n%s" + Printf.sprintf + "%s: already tagged token:\nC code context\n%s" tin.extra.current_rule_name (Common.error_message (Ast_c.file_of_info ib) (Ast_c.str_of_info ib, Ast_c.opos_of_info ib))) @@ -276,12 +305,17 @@ module XTRANS = struct let distribute_mck mcodekind distributef expr tin = match mcodekind with - | Ast_cocci.MINUS (pos,any_xxs) -> + | Ast_cocci.MINUS (pos,_,adj,any_xxs) -> + let inst = tin.extra.index in distributef ( - (fun ib -> tag_with_mck (Ast_cocci.MINUS (pos,any_xxs)) ib tin), - (fun ib -> tag_with_mck (Ast_cocci.MINUS (pos,[])) ib tin), - (fun ib -> tag_with_mck (Ast_cocci.MINUS (pos,[])) ib tin), - (fun ib -> tag_with_mck (Ast_cocci.MINUS (pos,any_xxs)) ib tin) + (fun ib -> + tag_with_mck (Ast_cocci.MINUS (pos,inst,adj,any_xxs)) ib tin), + (fun ib -> + tag_with_mck (Ast_cocci.MINUS (pos,inst,adj,[])) ib tin), + (fun ib -> + tag_with_mck (Ast_cocci.MINUS (pos,inst,adj,[])) ib tin), + (fun ib -> + tag_with_mck (Ast_cocci.MINUS (pos,inst,adj,any_xxs)) ib tin) ) expr | Ast_cocci.CONTEXT (pos,any_befaft) -> (match any_befaft with @@ -382,11 +416,11 @@ module XTRANS = struct let get_pos mck = match mck with | Ast_cocci.PLUS -> raise Impossible - | Ast_cocci.CONTEXT (Ast_cocci.FixPos (i1,i2),_) - | Ast_cocci.MINUS (Ast_cocci.FixPos (i1,i2),_) -> + | Ast_cocci.CONTEXT (Ast_cocci.FixPos (i1,i2),_) + | Ast_cocci.MINUS (Ast_cocci.FixPos (i1,i2),_,_,_) -> Ast_cocci.FixPos (i1,i2) - | Ast_cocci.CONTEXT (Ast_cocci.DontCarePos,_) - | Ast_cocci.MINUS (Ast_cocci.DontCarePos,_) -> + | Ast_cocci.CONTEXT (Ast_cocci.DontCarePos,_) + | Ast_cocci.MINUS (Ast_cocci.DontCarePos,_,_,_) -> Ast_cocci.DontCarePos | _ -> failwith "weird: dont have position info for the mcodekind" @@ -498,7 +532,7 @@ let transform_re_node a b tin = let (transform2: string (* rule name *) -> string list (* dropped_isos *) -> Lib_engine.metavars_binding (* inherited bindings *) -> - Lib_engine.transformation_info -> F.cflow -> F.cflow) = + Lib_engine.numbered_transformation_info -> F.cflow -> F.cflow) = fun rule_name dropped_isos binding0 xs cflow -> let extra = { @@ -506,19 +540,20 @@ let (transform2: string (* rule name *) -> string list (* dropped_isos *) -> optional_qualifier_iso = not(List.mem "optional_qualifier" dropped_isos); value_format_iso = not(List.mem "value_format" dropped_isos); current_rule_name = rule_name; + index = []; } in (* find the node, transform, update the node, and iter for all elements *) - xs +> List.fold_left (fun acc (nodei, binding, rule_elem) -> + xs +> List.fold_left (fun acc (index, (nodei, binding, rule_elem)) -> (* subtil: not cflow#nodes but acc#nodes *) let node = acc#nodes#assoc nodei in if !Flag.show_transinfo then pr2 "transform one node"; - + let tin = { - XTRANS.extra = extra; + XTRANS.extra = {extra with index = index}; XTRANS.binding = binding0@binding; XTRANS.binding0 = []; (* not used - everything constant for trans *) } in diff --git a/engine/transformation_c.mli b/engine/transformation_c.mli index c380456..0e943a9 100644 --- a/engine/transformation_c.mli +++ b/engine/transformation_c.mli @@ -2,5 +2,5 @@ val transform : string (* rule name *) -> string list (* dropped isos *) -> Lib_engine.metavars_binding -> (* inherited bindings *) - Lib_engine.transformation_info -> + Lib_engine.numbered_transformation_info -> Control_flow_c.cflow -> Control_flow_c.cflow (* could be unit *) diff --git a/flag_cocci.ml b/flag_cocci.ml index 247fa4e..7399eb2 100644 --- a/flag_cocci.ml +++ b/flag_cocci.ml @@ -41,11 +41,13 @@ let show_mcodekind_in_ctl = ref false let show_binding_in_out = ref false let show_dependencies = ref false +let verbose_cocci = ref true + let windows = ref false let popl = ref false -let ifdef_to_if = ref false +let ifdef_to_if = ref true(*false*) type include_options = I_UNSPECIFIED | I_NO_INCLUDES | I_NORMAL_INCLUDES | I_ALL_INCLUDES diff --git a/globals/config.ml.in b/globals/config.ml.in index 6d7bf93..3670c92 100644 --- a/globals/config.ml.in +++ b/globals/config.ml.in @@ -1,4 +1,4 @@ -let version = "0.1.7" +let version = "0.1.8" let path = try (Sys.getenv "COCCINELLE_HOME") diff --git a/install.txt b/install.txt index 8156c5f..f7b736a 100644 --- a/install.txt +++ b/install.txt @@ -16,12 +16,20 @@ Then simply type make make install -Note: 'make' will compile the bytecode version by default. - You could use 'make all.opt' to have the optimized version. - If you compile both, 'make install' will take care of that - and install both, spatch and spatch.opt. - If you use only one of them, 'make install' will install - the one you have compiled, either spatch ou spatch.opt, - under the front-end spatch. You could use 'make world' to - compile the bytecode and the native code version. + + + +'make' will compile the bytecode version by default. +You could use 'make all.opt' to have the optimized version. +If you compile both, 'make install' will take care of that +and install both, spatch and spatch.opt. +If you use only one of them, 'make install' will install +the one you have compiled, either spatch ou spatch.opt, +under the front-end spatch. You could use 'make world' to +compile the bytecode and the optimized code version. + +We provide the files generated by menhir in the tarball. +However, 'make distclean' will remove them. You could +either restore them from the tarball or install menhir. +Using 'make clean' should be safe with regards to these files. diff --git a/main.ml b/main.ml index 52096bb..7aa9ab5 100644 --- a/main.ml +++ b/main.ml @@ -38,17 +38,20 @@ let output_file = ref "" let inplace_modif = ref false (* but keeps a .cocci_orig *) let outplace_modif = ref false (* generates a .cocci_res *) -(* could be avoided by using Common.files_of_dir_or_files instead *) +(* somehow obsolete now *) let dir = ref false let include_headers = ref false let kbuild_info = ref "" +let macro_file = ref "" + (* test mode *) let test_mode = ref false let test_all = ref false let test_okfailed = ref false let test_regression_okfailed = ref false +let expected_score_file = ref "" (* action mode *) @@ -57,7 +60,6 @@ let action = ref "" (* works with -test but also in "normal" spatch mode *) let compare_with_expected = ref false - let distrib_index = ref (None : int option) let distrib_max = ref (None : int option) let mod_distrib = ref false @@ -86,14 +88,29 @@ let quiet_profile = ( FC.show_ctl_text; FC.show_binding_in_out; + FC.verbose_cocci; + + Flag_parsing_c.show_parsing_error; + + Flag_parsing_c.verbose_lexing; + Flag_parsing_c.verbose_parsing; + Flag_parsing_c.verbose_type; + Flag_parsing_c.verbose_cfg; + Flag_parsing_c.verbose_unparsing; + Flag_parsing_c.verbose_visit; + + Flag_matcher.verbose_matcher; + Flag_matcher.debug_engine; + + Flag_parsing_c.debug_unparsing; + Flag_parsing_cocci.show_SP; Flag_parsing_cocci.show_iso_failures; + Flag_ctl.verbose_ctl_engine; Flag_ctl.verbose_match; - Flag_matcher.debug_engine; - Flag_parsing_c.debug_unparsing; - Flag_parsing_c.verbose_type; - Flag_parsing_c.verbose_parsing; + + ]) (* some information that is useful in seeing why a semantic patch doesn't @@ -101,12 +118,24 @@ work properly *) let debug_profile = ( [ Flag.show_misc; + Flag.show_transinfo; + FC.show_diff; FC.show_cocci; FC.show_binding_in_out; FC.show_dependencies; - Flag.show_transinfo; + Flag_parsing_cocci.show_iso_failures; + + FC.verbose_cocci; + + Flag_parsing_c.verbose_cfg; + Flag_parsing_c.verbose_unparsing; + Flag_parsing_c.verbose_visit; + + Flag_matcher.verbose_matcher; + + Flag_parsing_c.show_parsing_error; ], [ @@ -200,7 +229,9 @@ let short_options = [ "-iso_file", Arg.Set_string Config.std_iso, " (default=" ^ !Config.std_iso ^")"; - "-macro_file", Arg.Set_string Config.std_h, + "-macro_file", Arg.Set_string macro_file, + " "; + "-macro_file_builtins", Arg.Set_string Config.std_h, " (default=" ^ !Config.std_h ^ ")"; "-all_includes", @@ -239,7 +270,7 @@ let short_options = [ " guess what"; "-date", Arg.Unit (fun () -> - pr2 "version: $Date: 2009/04/15 18:01:55 $"; + pr2 "version: $Date: 2009/05/08 16:15:31 $"; raise (Common.UnixExit 0) ), " guess what"; @@ -274,11 +305,12 @@ let other_options = [ "aliases and obsolete options", "", [ + "-sp", Arg.Set_string cocci_file, " short option of -sp_file"; + "-iso", Arg.Set_string Config.std_iso, " short option of -iso_file"; + "-cocci_file", Arg.Set_string cocci_file, " the semantic patch file"; - "-c", Arg.Set_string cocci_file, " short option of -cocci_file"; - "-iso", Arg.Set_string Config.std_iso, " short option of -iso_file"; - "-D", Arg.Set_string Config.std_h, " short option of -macro_file"; + "-c", Arg.Set_string cocci_file, " short option of -sp_file"; ]; "most useful show options", @@ -348,6 +380,8 @@ let other_options = [ "-filter_msg", Arg.Set Flag_parsing_c.filter_msg , " filter some cpp message when the macro is a \"known\" cpp construct"; "-filter_define_error",Arg.Set Flag_parsing_c.filter_define_error," "; + "-filter_msg_define_error",Arg.Set Flag_parsing_c.filter_msg_define_error, + " filter the error msg"; "-filter_passed_level", Arg.Set_int Flag_parsing_c.filter_passed_level," "; (* debug cfg doesn't seem to have any effect, so drop it as an option *) (* "-debug_cfg", Arg.Set Flag_parsing_c.debug_cfg , " "; *) @@ -423,6 +457,10 @@ let other_options = [ "-l1", Arg.Clear Flag_parsing_c.label_strategy_2, " "; "-ifdef_to_if", Arg.Set FC.ifdef_to_if, " convert ifdef to if (experimental)"; + "-no_ifdef_to_if", Arg.Clear FC.ifdef_to_if, + " convert ifdef to if (experimental)"; + + "-disable_multi_pass", Arg.Set Flag_parsing_c.disable_multi_pass, " "; "-noif0_passing", Arg.Clear Flag_parsing_c.if0_passing, " "; @@ -442,7 +480,15 @@ let other_options = [ any way of printing things out *) "-allow_inconsistent_paths", Arg.Set Flag_matcher.allow_inconsistent_paths, - "if this flag is set don't check for inconsistent paths; dangerous"; + " if this flag is set don't check for inconsistent paths; dangerous"; + "-int_bits", Arg.Int Flag_parsing_c.set_int_bits, + " the number of bits in an unsigned int"; + "-long_bits", Arg.Int Flag_parsing_c.set_long_bits, + " the number of bits in an unsigned long"; + "-linux_spacing", Arg.Unit Flag_parsing_c.set_linux_spacing, + " spacing of + code follows the conventions of Linux"; + "-smpl_spacing", Arg.Unit Flag_parsing_c.set_smpl_spacing, + " spacing of + code follows the semantic patch"; ]; "misc options", @@ -452,6 +498,8 @@ let other_options = [ " option to set if launch spatch in ocamldebug"; "-disable_once", Arg.Set Common.disable_pr2_once, " to print more messages"; + "-show_trace_profile", Arg.Set Common.show_trace_profile, + " show trace"; "-save_tmp_files", Arg.Set Common.save_tmp_files, " "; ]; @@ -490,6 +538,8 @@ let other_options = [ "-compare_with_expected", Arg.Set compare_with_expected, " use also file.res"; + "-expected_score_file", Arg.Set_string expected_score_file, + " which score file to compare with in -testall"; "-relax_include_path", Arg.Set FC.relax_include_path, " "; @@ -514,7 +564,6 @@ let other_options = [ let all_options = short_options ++ List.concat (List.map Common.thd3 other_options) - (* I don't want the -help and --help that are appended by Arg.align *) let arg_align2 xs = @@ -599,166 +648,175 @@ let glimpse_filter (coccifile, isofile) dir = let main_action xs = match xs with | x::xs -> - adjust_stdin x (fun () -> - if !cocci_file =$= "" - then failwith "I need a cocci file, use -sp_file "; - - if !dir && !Flag.patch =*= None - then - (match xs with - | [] -> Flag.patch := Some x - | _ -> - pr2 - ("warning: patch output can only be created when only one\n"^ - "directory is specified or when the -patch flag is used") - ); - - let infiles = - Common.profile_code "Main.infiles computation" (fun () -> - match !dir, !kbuild_info, !Flag.use_glimpse with - (* glimpse *) - | false, _, true -> - failwith "-use_glimpse works only with -dir" - | true, s, true when s <> "" -> - failwith "-use_glimpse does not work with -kbuild" - | true, "", true -> - if not (null xs) - then failwith "-use_glimpse can accept only one dir"; - - Flag.dir := x; - let files = - match glimpse_filter (!cocci_file, !Config.std_iso) x with - None -> - Common.cmd_to_list (* same as "true, "", _" case *) - (if !include_headers - (* FIXME : Could we remove xs ? - -use_glimpse requires a singleton. - This is checked some lines before. - then ("find "^(join " " (x::xs))^" -name \"*.[ch]\"") - else ("find "^(join " " (x::xs))^" -name \"*.c\"")) - *) - then ("find "^ x ^" -name \"*.[ch]\"") - else ("find "^ x ^" -name \"*.c\"")) - | Some files -> files in - files +> List.map (fun x -> [x]) - (* normal *) - | false, _, _ -> [x::xs] - | true, "", _ -> - Common.cmd_to_list - (if !include_headers - then ("find "^(join " " (x::xs))^" -name \"*.[ch]\"") + + (* a more general solution would be to use + * Common.files_of_dir_or_files (x::xs) + * as some elements in xs may also be directories, or individual + * files. + *) + if Common.is_directory x + then dir := true; + + adjust_stdin x (fun () -> + if !cocci_file =$= "" + then failwith "I need a cocci file, use -sp_file "; + + if !dir && !Flag.patch =*= None + then + (match xs with + | [] -> Flag.patch := Some x + | _ -> + pr2 + ("warning: patch output can only be created when only one\n"^ + "directory is specified or when the -patch flag is used") + ); + + let infiles = + Common.profile_code "Main.infiles computation" (fun () -> + match !dir, !kbuild_info, !Flag.use_glimpse with + (* glimpse *) + | false, _, true -> + failwith "-use_glimpse works only with -dir" + | true, s, true when s <> "" -> + failwith "-use_glimpse does not work with -kbuild" + | true, "", true -> + if not (null xs) + then failwith "-use_glimpse can accept only one dir"; + + Flag.dir := x; + let files = + match glimpse_filter (!cocci_file, !Config.std_iso) x with + None -> + Common.cmd_to_list (* same as "true, "", _" case *) + (if !include_headers + (* FIXME : Could we remove xs ? + -use_glimpse requires a singleton. + This is checked some lines before. + then ("find "^(join " " (x::xs))^" -name \"*.[ch]\"") + else ("find "^(join " " (x::xs))^" -name \"*.c\"")) + *) + then ("find "^ x ^" -name \"*.[ch]\"") + else ("find "^ x ^" -name \"*.c\"")) + | Some files -> files in + files +> List.map (fun x -> [x]) + (* normal *) + | false, _, _ -> [x::xs] + | true, "", _ -> + Common.cmd_to_list + (if !include_headers + then ("find "^(join " " (x::xs))^" -name \"*.[ch]\"") else ("find "^(join " " (x::xs))^" -name \"*.c\"")) - +> List.map (fun x -> [x]) - - (* kbuild *) - | true, kbuild_info_file,_ -> - let dirs = - Common.cmd_to_list ("find "^(join " " (x::xs))^" -type d") - in - let info = Kbuild.parse_kbuild_info kbuild_info_file in - let groups = Kbuild.files_in_dirs dirs info in - - groups +> List.map (function Kbuild.Group xs -> xs) - ) - in - - let infiles = - match (!distrib_index,!distrib_max) with - (None,None) -> infiles - | (Some index,Some max) -> - (if index >= max - then - failwith "index starts at 0, and so must be less than max"); - if !mod_distrib - then + +> List.map (fun x -> [x]) + + (* kbuild *) + | true, kbuild_info_file,_ -> + let dirs = + Common.cmd_to_list ("find "^(join " " (x::xs))^" -type d") + in + let info = Kbuild.parse_kbuild_info kbuild_info_file in + let groups = Kbuild.files_in_dirs dirs info in + + groups +> List.map (function Kbuild.Group xs -> xs) + ) + in + + let infiles = + match (!distrib_index,!distrib_max) with + (None,None) -> infiles + | (Some index,Some max) -> + (if index >= max + then + failwith "index starts at 0, and so must be less than max"); + if !mod_distrib + then + let rec loop ct = function + [] -> [] + | x::xs -> + if (ct mod max) =|= index + then x::(loop (ct+1) xs) + else loop (ct+1) xs in + loop 0 infiles + else + begin + let all_files = List.length infiles in + let regions = (all_files + (max - 1)) / max in + let this_min = index * regions in + let this_max = (index+1) * regions in let rec loop ct = function - [] -> [] + [] -> [] | x::xs -> - if (ct mod max) =|= index + if this_min <= ct && ct < this_max then x::(loop (ct+1) xs) else loop (ct+1) xs in loop 0 infiles - else - begin - let all_files = List.length infiles in - let regions = (all_files + (max - 1)) / max in - let this_min = index * regions in - let this_max = (index+1) * regions in - let rec loop ct = function - [] -> [] - | x::xs -> - if this_min <= ct && ct < this_max - then x::(loop (ct+1) xs) - else loop (ct+1) xs in - loop 0 infiles - end - | _ -> failwith "inconsistent distribution information" in - - let outfiles = - Common.profile_code "Main.outfiles computation" (fun () -> - let cocci_infos = - Cocci.pre_engine (!cocci_file, !Config.std_iso) in - let res = - infiles +> List.map (fun cfiles -> - pr2 ("HANDLING: " ^ (join " " cfiles)); - Common.timeout_function_opt !FC.timeout (fun () -> - Common.report_if_take_time 10 (join " " cfiles) (fun () -> + end + | _ -> failwith "inconsistent distribution information" in + + let outfiles = + Common.profile_code "Main.outfiles computation" (fun () -> + let cocci_infos = + Cocci.pre_engine (!cocci_file, !Config.std_iso) in + let res = + infiles +> List.map (fun cfiles -> + pr2 ("HANDLING: " ^ (join " " cfiles)); + Common.timeout_function_opt !FC.timeout (fun () -> + Common.report_if_take_time 10 (join " " cfiles) (fun () -> (* Unix.sleep 1; *) - try - (* this is the main call *) - Cocci.full_engine cocci_infos cfiles - with - | Common.UnixExit x -> raise (Common.UnixExit x) - | e -> - if !dir - then begin - pr2 ("EXN:" ^ Printexc.to_string e); - [] (* *) - end - else raise e))) in - Cocci.post_engine cocci_infos; - res - ) +> List.concat - in - - Common.profile_code "Main.result analysis" (fun () -> - - Ctlcocci_integration.print_bench(); + try + (* this is the main call *) + Cocci.full_engine cocci_infos cfiles + with + | Common.UnixExit x -> raise (Common.UnixExit x) + | e -> + if !dir + then begin + pr2 ("EXN:" ^ Printexc.to_string e); + [] (* *) + end + else raise e))) in + Cocci.post_engine cocci_infos; + res + ) +> List.concat + in + + Common.profile_code "Main.result analysis" (fun () -> + + Ctlcocci_integration.print_bench(); + + let outfiles = Cocci.check_duplicate_modif outfiles in + + outfiles +> List.iter (fun (infile, outopt) -> + outopt +> Common.do_option (fun outfile -> + if !inplace_modif + then begin + Common.command2 ("cp "^infile^" "^infile^".cocci_orig"); + Common.command2 ("cp "^outfile^" "^infile); + end; + + if !outplace_modif + then Common.command2 ("cp "^outfile^" "^infile^".cocci_res"); - let outfiles = Cocci.check_duplicate_modif outfiles in - - outfiles +> List.iter (fun (infile, outopt) -> - outopt +> Common.do_option (fun outfile -> - if !inplace_modif - then begin - Common.command2 ("cp "^infile^" "^infile^".cocci_orig"); - Common.command2 ("cp "^outfile^" "^infile); - end; - - if !outplace_modif - then Common.command2 ("cp "^outfile^" "^infile^".cocci_res"); - - if !output_file =$= "" - then begin - let tmpfile = "/tmp/"^Common.basename infile in - pr2 (spf "One file modified. Result is here: %s" tmpfile); - Common.command2 ("cp "^outfile^" "^tmpfile); - end - )); - if !output_file <> "" then - (match outfiles with - | [infile, Some outfile] when infile =$= x && null xs -> - Common.command2 ("cp " ^outfile^ " " ^ !output_file); - | [infile, None] when infile =$= x && null xs -> - Common.command2 ("cp " ^infile^ " " ^ !output_file); - | _ -> - failwith - ("-o can not be applied because there is multiple " ^ - "modified files"); - ); - - if !compare_with_expected - then Testing.compare_with_expected outfiles)) + if !output_file =$= "" + then begin + let tmpfile = "/tmp/"^Common.basename infile in + pr2 (spf "One file modified. Result is here: %s" tmpfile); + Common.command2 ("cp "^outfile^" "^tmpfile); + end + )); + if !output_file <> "" then + (match outfiles with + | [infile, Some outfile] when infile =$= x && null xs -> + Common.command2 ("cp " ^outfile^ " " ^ !output_file); + | [infile, None] when infile =$= x && null xs -> + Common.command2 ("cp " ^infile^ " " ^ !output_file); + | _ -> + failwith + ("-o can not be applied because there is multiple " ^ + "modified files"); + ); + + if !compare_with_expected + then Testing.compare_with_expected outfiles)) | [] -> raise Impossible @@ -777,9 +835,13 @@ let main () = let args = ref [] in + (* Gc.set {(Gc.get ()) with Gc.stack_limit = 1024 * 1024};*) + (* this call can set up many global flag variables via the cmd line *) arg_parse2 (Arg.align all_options) (fun x -> args := x::!args) usage_msg; + (* julia hack so that one can override directories specified on + * the command line. *) (if !dir then let chosen_dir = @@ -794,6 +856,7 @@ let main () = else List.hd !args in if !FC.include_path =*= None then FC.include_path := Some (Filename.concat chosen_dir "include")); + args := List.rev !args; if !cocci_file <> "" && (not (!cocci_file =~ ".*\\.\\(sgrep\\|spatch\\)$")) @@ -805,7 +868,10 @@ let main () = then Config.std_h := Common.adjust_ext_if_needed !Config.std_h ".h"; if !Config.std_h <> "" - then Parse_c.init_defs !Config.std_h; + then Parse_c.init_defs_builtins !Config.std_h; + + if !macro_file <> "" + then Parse_c.init_defs_macros !macro_file; (* must be done after Arg.parse, because Common.profile is set by it *) @@ -825,7 +891,9 @@ let main () = | [] when !test_all -> FC.include_path := Some "tests/include"; - Testing.testall () + if !expected_score_file <> "" + then Testing.testall ~expected_score_file:!expected_score_file () + else Testing.testall () | [] when !test_regression_okfailed -> Testing.test_regression_okfailed () @@ -876,9 +944,21 @@ let main () = end end + +let main_with_better_error_report () = + if !Common.debugger then main () + else + try + main () + with + | Unix.Unix_error (_, "stat", filename) -> + pr2 (spf "ERROR: File %s does not exist" filename); + raise (UnixExit (-1)) + + (*****************************************************************************) -let _ = +let start = Common.main_boilerplate (fun () -> - main (); + main_with_better_error_report (); Ctlcocci_integration.print_bench(); ) diff --git a/menhirlib/Makefile b/menhirlib/Makefile index f412b78..fdf2583 100644 --- a/menhirlib/Makefile +++ b/menhirlib/Makefile @@ -18,7 +18,7 @@ EXTRAOPT=-for-pack MenhirLib ############################################################################## # Generic variables ############################################################################## -OCAMLCFLAGS=-g -dtypes +OCAMLCFLAGS ?=-g -dtypes OPTFLAGS= OCAMLC=ocamlc$(OPTBIN) $(OCAMLCFLAGS) $(INCLUDES) diff --git a/ocamlsexp/Makefile b/ocamlsexp/Makefile index fd31cc9..dc91b3e 100644 --- a/ocamlsexp/Makefile +++ b/ocamlsexp/Makefile @@ -64,7 +64,7 @@ SYSLIBS= str.cma unix.cma bigarray.cma num.cma ############################################################################## #dont use -custom, it makes the bytecode unportable. -OCAMLCFLAGS= -g -dtypes # -w A +OCAMLCFLAGS ?= -g -dtypes # -w A #-for-pack Sexplib # This flag is also used in subdirectories so don't change its name here. @@ -111,10 +111,10 @@ $(TARGETPACK).cmo: $(OBJS) # special handling, fun that they use cpp whereas they claim camplp4 can do everything pre_sexp.cmo: pre_sexp.ml - $(OCAMLC) -pp cpp -c $< + $(OCAMLC) -pp "cpp -w" -c $< pre_sexp.cmx: pre_sexp.ml - $(OCAMLOPT) -pp cpp -c $< + $(OCAMLOPT) -pp "cpp -w" -c $< @@ -158,7 +158,7 @@ beforedepend:: # need also -pp cpp here depend:: beforedepend - $(OCAMLDEP) -pp cpp *.mli *.ml > .depend + $(OCAMLDEP) -pp "cpp -w" *.mli *.ml > .depend distclean: clean rm -f .depend diff --git a/parsing_c/Makefile b/parsing_c/Makefile index 9850b55..3be6d2e 100644 --- a/parsing_c/Makefile +++ b/parsing_c/Makefile @@ -9,14 +9,15 @@ TARGET=parsing_c # - type_cocci.ml ast_cocci.ml # + unparse_hrule SRC= flag_parsing_c.ml parsing_stat.ml \ - token_c.ml ast_c.ml control_flow_c.ml type_c.ml \ + token_c.ml ast_c.ml control_flow_c.ml \ visitor_c.ml lib_parsing_c.ml \ - ast_to_flow.ml \ + control_flow_c_build.ml \ pretty_print_c.ml \ semantic_c.ml lexer_parser.ml parser_c.ml lexer_c.ml \ - token_helpers.ml parsing_hacks.ml \ + token_helpers.ml token_views_c.ml \ + cpp_token_c.ml parsing_hacks.ml \ unparse_cocci.ml unparse_c.ml unparse_hrule.ml \ - parse_c.ml \ + parse_c.ml type_c.ml \ cpp_ast_c.ml \ type_annoter_c.ml comment_annotater_c.ml \ compare_c.ml \ @@ -38,7 +39,7 @@ INCLUDES= -I ../commons -I ../commons/ocamlextra -I ../commons/ocollection \ #LIBS=../commons/commons.cma #INCLUDES= -I ../commons -SYSLIBS= str.cma unix.cma +SYSLIBS= str.cma unix.cma num.cma ############################################################################## # Generic variables @@ -78,8 +79,6 @@ $(TARGET).top: $(OBJS) $(LIBS) clean:: rm -f $(TARGET).top - - lexer_c.ml: lexer_c.mll $(OCAMLLEX) $< clean:: @@ -146,6 +145,9 @@ distclean:: beforedepend:: +distclean:: + rm -f .depend + depend:: beforedepend $(OCAMLDEP) *.mli *.ml > .depend diff --git a/parsing_c/ast_c.ml b/parsing_c/ast_c.ml index d8824f6..747fac8 100644 --- a/parsing_c/ast_c.ml +++ b/parsing_c/ast_c.ml @@ -67,9 +67,11 @@ open Common (* forunparser: *) type posl = int * int (* line-col, for MetaPosValList, for position variables *) + (* with sexp *) (* the virtual position is set in Parsing_hacks.insert_virtual_positions *) type virtual_position = Common.parse_info * int (* character offset *) + (* with sexp *) type parse_info = (* Present both in ast and list of tokens *) @@ -85,6 +87,7 @@ type parse_info = * are used to be able to use '=' to compare big ast portions. *) | AbstractLineTok of Common.parse_info (* local to the abstracted thing *) + (* with sexp *) type info = { pinfo : parse_info; @@ -92,7 +95,7 @@ type info = { (* this cocci_tag can be changed, which is how we can express some program * transformations by tagging the tokens involved in this transformation. *) - cocci_tag: (Ast_cocci.mcodekind * metavars_binding) ref; + cocci_tag: (Ast_cocci.mcodekind * metavars_binding) option ref; (* set in comment_annotater_c.ml *) comments_tag: comments_around ref; @@ -102,9 +105,16 @@ and il = info list (* wrap2 is like wrap, except that I use it often for separator such * as ','. In that case the info is associated to the argument that - * follows, so in 'a,b' I will have in the list [(a,[]); (b,[','])]. *) + * follows, so in 'a,b' I will have in the list [(a,[]); (b,[','])]. + * + * wrap3 is like wrap, except that I use it in case sometimes it + * will be empty because the info will be included in a nested + * entity (e.g. for Ident in expr because it's inlined in the name) + * so user should never assume List.length wrap3 > 0. + *) and 'a wrap = 'a * il and 'a wrap2 = 'a * il +and 'a wrap3 = 'a * il (* * evotype*) (* ------------------------------------------------------------------------- *) (* Name *) @@ -113,6 +123,14 @@ and 'a wrap2 = 'a * il (* was called 'ident' before, but 'name' is I think better * as concatenated strings can be used not only for identifiers and for * declarators, but also for fields, for labels, etc. + * + * Note: because now the info is embeded in the name, the info for + * expression like Ident, or types like Typename, are not anymore + * stored in the expression or type. Hence if you assume this, + * which was true before, you are now wrong. So never write code like + * let (unwrape,_), ii = e and use 'ii' believing it contains + * the local ii to e. If you want to do that, use the appropiate + * wrapper get_local_ii_of_expr_inlining_ii_of_name. *) and name = | RegularName of string wrap @@ -150,7 +168,7 @@ and name = and fullType = typeQualifier * typeC - and typeC = typeCbis wrap + and typeC = typeCbis wrap (* todo reput wrap3 *) and typeCbis = | BaseType of baseType @@ -208,14 +226,14 @@ and fullType = typeQualifier * typeC (* -------------------------------------- *) and structUnion = Struct | Union and structType = field list - and field = fieldbis wrap - and fieldbis = + and field = | DeclarationField of field_declaration (* gccext: *) - | EmptyField + | EmptyField of info (* cppext: *) - | MacroStructDeclTodo + | MacroDeclField of (string * argument wrap2 list) + wrap (* optional ';'*) (* cppext: *) | CppDirectiveStruct of cpp_directive @@ -265,7 +283,7 @@ and attribute = attributebis wrap (* ------------------------------------------------------------------------- *) (* C expression *) (* ------------------------------------------------------------------------- *) -and expression = (expressionbis * exp_info ref (* semantic: *)) wrap +and expression = (expressionbis * exp_info ref (* semantic: *)) wrap3 and exp_info = exp_type option * test and exp_type = fullType (* Type_c.completed_and_simplified *) * local and local = LocalVar of parse_info | NotLocalVar (* cocci: *) @@ -306,7 +324,7 @@ and expression = (expressionbis * exp_info ref (* semantic: *)) wrap | Cast of fullType * expression (* gccext: *) - | StatementExpr of compound wrap (* ( ) new scope *) + | StatementExpr of compound wrap (* ( ) new scope *) | Constructor of fullType * initialiser wrap2 (* , *) list (* forunparser: *) @@ -315,7 +333,7 @@ and expression = (expressionbis * exp_info ref (* semantic: *)) wrap (* cppext: IfdefExpr TODO *) (* cppext: normmally just expression *) - and argument = (expression, weird_argument) either + and argument = (expression, weird_argument) Common.either and weird_argument = | ArgType of parameterType | ArgAction of action_macro @@ -336,7 +354,7 @@ and expression = (expressionbis * exp_info ref (* semantic: *)) wrap | String of (string * isWchar) | MultiString of string list (* can contain MacroString, todo: more info *) | Char of (string * isWchar) (* normally it is equivalent to Int *) - | Int of (string (* * intType*)) + | Int of (string * intType) | Float of (string * floatType) and isWchar = IsWchar | IsChar @@ -373,7 +391,7 @@ and expression = (expressionbis * exp_info ref (* semantic: *)) wrap * *) -and statement = statementbis wrap +and statement = statementbis wrap3 and statementbis = | Labeled of labeled | Compound of compound (* new scope *) @@ -488,7 +506,7 @@ and statement = statementbis wrap and declaration = | DeclList of onedecl wrap2 (* , *) list wrap (* ; fakestart sto *) (* cppext: *) - | MacroDecl of (string * argument wrap2 list) wrap + | MacroDecl of (string * argument wrap2 list) wrap (* fakestart *) and onedecl = { v_namei: (name * (info (* = *) * initialiser) option) option; @@ -535,7 +553,7 @@ and declaration = and definition = definitionbis wrap (* ( ) { } fakestart sto *) and definitionbis = { f_name: name; - f_type: functionType; (* todo? a functionType2 ? *) + f_type: functionType; (* less? a functionType2 ? *) f_storage: storage; f_body: compound; f_attr: attribute list; (* gccext: *) @@ -553,7 +571,7 @@ and cpp_directive = | PragmaAndCo of il (*| Ifdef ? no, ifdefs are handled differently, cf ifdef_directive below *) -and define = string wrap (* #define s *) * (define_kind * define_val) +and define = string wrap (* #define s eol *) * (define_kind * define_val) and define_kind = | DefineVar | DefineFunc of ((string wrap) wrap2 list) wrap (* () *) @@ -650,7 +668,6 @@ and toplevel = (* ------------------------------------------------------------------------- *) and program = toplevel list - (*****************************************************************************) (* Cocci Bindings *) (*****************************************************************************) @@ -697,10 +714,12 @@ and metavars_binding = (Ast_cocci.meta_name, metavar_binding_kind) assoc and comments_around = { mbefore: Token_c.comment_like_token list; mafter: Token_c.comment_like_token list; -} -(* old: can do something simpler than CComment for coccinelle, cf above. - mbefore: comment_and_relative_pos list; - mafter: comment_and_relative_pos list; + + (* less: could remove ? do something simpler than CComment for + * coccinelle, cf above. *) + mbefore2: comment_and_relative_pos list; + mafter2: comment_and_relative_pos list; + } and comment_and_relative_pos = { minfo: Common.parse_info; @@ -715,13 +734,12 @@ and comments_around = { * cppbetween: bool; touse? if false positive * is_alone_in_line: bool; (*for labels, to avoid false positive*) *) - } + } and comment = Common.parse_info and com = comment list ref -*) - + (* with sexp *) (*****************************************************************************) @@ -736,17 +754,28 @@ let noType () = ref (None,NotTest) let noInstr = (ExprStatement (None), []) let noTypedefDef () = None - let emptyMetavarsBinding = ([]: metavars_binding) -let emptyAnnot = +let emptyAnnotCocci = (Ast_cocci.CONTEXT (Ast_cocci.NoPos,Ast_cocci.NOTHING), emptyMetavarsBinding) +let emptyAnnot = + (None: (Ast_cocci.mcodekind * metavars_binding) option) + +(* compatibility mode *) +let mcode_and_env_of_cocciref aref = + match !aref with + | Some x -> x + | None -> emptyAnnotCocci + + let emptyComments= { mbefore = []; mafter = []; + mbefore2 = []; + mafter2 = []; } @@ -781,10 +810,36 @@ let unwrap = fst let unwrap2 = fst - let unwrap_expr ((unwrap_e, typ), iie) = unwrap_e let rewrap_expr ((_old_unwrap_e, typ), iie) newe = ((newe, typ), iie) +let unwrap_typeC (qu, (typeC, ii)) = typeC +let rewrap_typeC (qu, (typeC, ii)) newtypeC = (qu, (newtypeC, ii)) + +let unwrap_typeCbis (typeC, ii) = typeC + +let unwrap_st (unwrap_st, ii) = unwrap_st + +(* ------------------------------------------------------------------------- *) +let mk_e unwrap_e ii = (unwrap_e, noType()), ii +let mk_e_bis unwrap_e ty ii = (unwrap_e, ty), ii + +let mk_ty typeC ii = nQ, (typeC, ii) +let mk_tybis typeC ii = (typeC, ii) + +let mk_st unwrap_st ii = (unwrap_st, ii) + +(* ------------------------------------------------------------------------- *) +let get_ii_typeC_take_care (typeC, ii) = ii +let get_ii_st_take_care (st, ii) = ii +let get_ii_expr_take_care (e, ii) = ii + +let get_st_and_ii (st, ii) = st, ii +let get_ty_and_ii (qu, (typeC, ii)) = qu, (typeC, ii) +let get_e_and_ii (e, ii) = e, ii + + +(* ------------------------------------------------------------------------- *) let get_type_expr ((unwrap_e, typ), iie) = !typ let set_type_expr ((unwrap_e, oldtyp), iie) newtyp = oldtyp := newtyp @@ -800,12 +855,6 @@ let get_onlylocal_expr ((unwrap_e, typ), iie) = | Some (ft,local), _test -> Some local | None, _ -> None - - -let unwrap_typeC (qu, (typeC, ii)) = typeC -let rewrap_typeC (qu, (typeC, ii)) newtypeC = (qu, (newtypeC, ii)) - - (* ------------------------------------------------------------------------- *) let rewrap_str s ii = {ii with pinfo = @@ -818,6 +867,8 @@ let rewrap_str s ii = let rewrap_pinfo pi ii = {ii with pinfo = pi} + + (* info about the current location *) let get_pi = function OriginTok pi -> pi @@ -828,7 +879,7 @@ let get_pi = function (* original info *) let get_opi = function OriginTok pi -> pi - | ExpandedTok (pi,_) -> pi + | ExpandedTok (pi,_) -> pi (* diff with get_pi *) | FakeTok (_,_) -> failwith "no position information" | AbstractLineTok pi -> pi @@ -849,7 +900,7 @@ let get_info f ii = let get_orig_info f ii = match ii.pinfo with OriginTok pi -> f pi - | ExpandedTok (pi,_) -> f pi + | ExpandedTok (pi,_) -> f pi (* diff with get_info *) | FakeTok (_,(pi,_)) -> f pi | AbstractLineTok pi -> f pi @@ -861,7 +912,7 @@ let opos_of_info ii = get_orig_info (function x -> x.Common.charpos) ii let line_of_info ii = get_orig_info (function x -> x.Common.line) ii let col_of_info ii = get_orig_info (function x -> x.Common.column) ii let file_of_info ii = get_orig_info (function x -> x.Common.file) ii -let mcode_of_info ii = fst (!(ii.cocci_tag)) +let mcode_of_info ii = fst (mcode_and_env_of_cocciref ii.cocci_tag) let pinfo_of_info ii = ii.pinfo let parse_info_of_info ii = get_pi ii.pinfo @@ -915,7 +966,7 @@ let info_to_fixpos ii = (* cocci: *) let is_test (e : expression) = - let (_,info) = unwrap e in + let (_,info), _ = e in let (_,test) = !info in test =*= Test @@ -973,7 +1024,10 @@ let al_comments x = Common.line = magic_real_number; Common.column = magic_real_number}) in {mbefore = []; (* duplicates mafter of the previous token *) - mafter = List.map al_com (keep_cpp x.mafter)} + mafter = List.map al_com (keep_cpp x.mafter); + mbefore2=[]; + mafter2=[]; + } let al_info_cpp tokenindex x = { pinfo = @@ -1044,26 +1098,6 @@ let rec (unsplit_comma: ('a, il) either list -> 'a wrap2 list) = (* Helpers, could also be put in lib_parsing_c.ml instead *) (*****************************************************************************) -let rec stmt_elems_of_sequencable xs = - xs +> Common.map (fun x -> - match x with - | StmtElem e -> [e] - | CppDirectiveStmt _ - | IfdefStmt _ - -> - pr2_once ("stmt_elems_of_sequencable: filter a directive"); - [] - | IfdefStmt2 (_ifdef, xxs) -> - pr2 ("stmt_elems_of_sequencable: IfdefStm2 TODO?"); - xxs +> List.map (fun xs -> - let xs' = stmt_elems_of_sequencable xs in - xs' - ) +> List.flatten - ) +> List.flatten - - - - (* should maybe be in pretty_print_c ? *) let s_of_inc_file inc_file = @@ -1089,6 +1123,8 @@ let s_of_attr attr = +> List.map (fun (Attribute s, ii) -> s) +> Common.join "," + +(* ------------------------------------------------------------------------- *) let str_of_name ident = match ident with | RegularName (s,ii) -> s @@ -1100,27 +1136,64 @@ let str_of_name ident = (xs +> List.map (fun ((x,iix), iicomma) -> x) +> Common.join ",") ^ ")" -let info_of_name ident = - match ident with - | RegularName (s,ii) -> List.hd ii +let get_s_and_ii_of_name name = + match name with + | RegularName (s, iis) -> s, iis + | CppIdentBuilder ((s, iis), xs) -> s, iis + | CppVariadicName (s,iis) -> + let (iop, iis) = Common.tuple_of_list2 iis in + s, [iis] | CppConcatenatedName xs -> (match xs with | [] -> raise Impossible - | ((x,ii1),ii2)::xs -> - List.hd ii1 + | ((s,iis),noiiop)::xs -> + s, iis ) - | CppVariadicName (s, ii) -> - let (iihash, iis) = Common.tuple_of_list2 ii in - iihash - | CppIdentBuilder ((s,iis),xs) -> - List.hd iis -let get_s_and_ii_of_name name = - match name with - | RegularName (s, iis) -> s, List.hd iis - | _ -> raise Todo +let get_s_and_info_of_name name = + let (s,ii) = get_s_and_ii_of_name name in + s, List.hd ii + +let info_of_name name = + let (s,ii) = get_s_and_ii_of_name name in + List.hd ii + +let ii_of_name name = + let (s,ii) = get_s_and_ii_of_name name in + ii + +let get_local_ii_of_expr_inlining_ii_of_name e = + let (ebis,_),ii = e in + match ebis, ii with + | Ident name, noii -> + assert(null noii); + ii_of_name name + | RecordAccess (e, name), ii -> + ii @ ii_of_name name + | RecordPtAccess (e, name), ii -> + ii @ ii_of_name name + | _, ii -> ii + + +let get_local_ii_of_tybis_inlining_ii_of_name ty = + match ty with + | TypeName (name, _typ), [] -> ii_of_name name + | _, ii -> ii + +(* only Label and Goto have name *) +let get_local_ii_of_st_inlining_ii_of_name st = + match st with + | Labeled (Label (name, st)), ii -> ii_of_name name @ ii + | Jump (Goto name), ii -> + let (i1, i3) = Common.tuple_of_list2 ii in + [i1] @ ii_of_name name @ [i3] + | _, ii -> ii + + + +(* ------------------------------------------------------------------------- *) let name_of_parameter param = param.p_namei +> Common.map_option (str_of_name) diff --git a/parsing_c/comment_annotater_c.ml b/parsing_c/comment_annotater_c.ml index 2885b56..ebcd0a1 100644 --- a/parsing_c/comment_annotater_c.ml +++ b/parsing_c/comment_annotater_c.ml @@ -127,6 +127,8 @@ let annotate_program toks asts = info.Ast_c.comments_tag := { Ast_c.mbefore = before'; Ast_c.mafter = after'; + mbefore2 = []; + mafter2 = []; }; ); diff --git a/parsing_c/compare_c.ml b/parsing_c/compare_c.ml index bb5894a..0b9062f 100644 --- a/parsing_c/compare_c.ml +++ b/parsing_c/compare_c.ml @@ -71,7 +71,7 @@ let normal_form_program xs = Visitor_c.kexpr_s = (fun (k,bigf) e -> match e with (* todo: should also do something for multistrings *) - | (Constant (String (s,kind)), typ), [ii] + | (Constant (String (s,kind)), typ), [ii] when Common.string_match_substring cvs_keyword_regexp s -> let newstr = cvs_compute_newstr s in (Constant (String (newstr,kind)), typ), [rewrap_str newstr ii] diff --git a/parsing_c/control_flow_c.ml b/parsing_c/control_flow_c.ml index fafae71..4bddb08 100644 --- a/parsing_c/control_flow_c.ml +++ b/parsing_c/control_flow_c.ml @@ -141,23 +141,23 @@ type node = node1 * string * if they are in different nodes. Solved by using shared ref * and allow the "already-tagged" token. *) - | SeqStart of statement * int * info + | SeqStart of fullstatement * int * info | SeqEnd of int * info - | ExprStatement of statement * (expression option) wrap + | ExprStatement of fullstatement * (expression option) wrap - | IfHeader of statement * expression wrap + | IfHeader of fullstatement * expression wrap | Else of info - | WhileHeader of statement * expression wrap - | DoHeader of statement * info + | WhileHeader of fullstatement * expression wrap + | DoHeader of fullstatement * info | DoWhileTail of expression wrap - | ForHeader of statement * + | ForHeader of fullstatement * (exprStatement wrap * exprStatement wrap * exprStatement wrap) wrap - | SwitchHeader of statement * expression wrap - | MacroIterHeader of statement * (string * argument wrap2 list) wrap + | SwitchHeader of fullstatement * expression wrap + | MacroIterHeader of fullstatement * (string * argument wrap2 list) wrap (* Used to mark the end of if, while, dowhile, for, switch. Later we * will be able to "tag" some cocci code on this node. @@ -198,8 +198,8 @@ type node = node1 * string *) | EndStatement of info option (* fake_info *) - | Return of statement * unit wrap - | ReturnExpr of statement * expression wrap + | Return of fullstatement * unit wrap + | ReturnExpr of fullstatement * expression wrap (* ------------------------ *) | IfdefHeader of ifdef_directive @@ -221,11 +221,11 @@ type node = node1 * string | MacroTop of string * argument wrap2 list * il (* ------------------------ *) - | Case of statement * expression wrap - | Default of statement * unit wrap + | Case of fullstatement * expression wrap + | Default of fullstatement * unit wrap - | Continue of statement * unit wrap - | Break of statement * unit wrap + | Continue of fullstatement * unit wrap + | Break of fullstatement * unit wrap (* no counter part in cocci *) | CaseRange of fullstatement * (expression * expression) wrap @@ -233,8 +233,8 @@ type node = node1 * string | Goto of fullstatement * name * unit wrap (* goto *) - | Asm of statement * asmbody wrap - | MacroStmt of statement * unit wrap + | Asm of fullstatement * asmbody wrap + | MacroStmt of fullstatement * unit wrap (* ------------------------ *) (* some control nodes *) diff --git a/parsing_c/ast_to_flow.ml b/parsing_c/control_flow_c_build.ml similarity index 91% rename from parsing_c/ast_to_flow.ml rename to parsing_c/control_flow_c_build.ml index 6bd0826..588efbf 100644 --- a/parsing_c/ast_to_flow.ml +++ b/parsing_c/control_flow_c_build.ml @@ -20,6 +20,12 @@ open Ograph_extended open Oassoc open Oassocb +module Lib = Lib_parsing_c + +(*****************************************************************************) +(* Wrappers *) +(*****************************************************************************) +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_cfg (*****************************************************************************) (* todo?: compute target level with goto (but rare that different I think) @@ -47,6 +53,7 @@ type error = | DeadCode of Common.parse_info option | CaseNoSwitch of Common.parse_info | OnlyBreakInSwitch of Common.parse_info + | WeirdSwitch of Common.parse_info | NoEnclosingLoop of Common.parse_info | GotoCantFindLabel of string * Common.parse_info | NoExit of Common.parse_info @@ -173,8 +180,9 @@ let compute_labels_and_create_them st = begin st +> Visitor_c.vk_statement { Visitor_c.default_visitor_c with Visitor_c.kstatement = (fun (k, bigf) st -> - match st with - | Labeled (Ast_c.Label (name, _st)),ii -> + match Ast_c.unwrap_st st with + | Labeled (Ast_c.Label (name, _st)) -> + let ii = Ast_c.get_ii_st_take_care st in (* at this point I put a lbl_0, but later I will put the * good labels. *) let s = Ast_c.str_of_name name in @@ -187,7 +195,7 @@ let compute_labels_and_create_them st = (* not k _st !!! otherwise in lbl1: lbl2: i++; we miss lbl2 *) k st; end - | st -> k st + | _st -> k st ) }; !h; @@ -282,12 +290,13 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = compound_caller = Statement; } in - + let ii = Ast_c.get_ii_st_take_care stmt in + (* ------------------------- *) - match stmt with + match Ast_c.unwrap_st stmt with (* coupling: the Switch case copy paste parts of the Compound case *) - | Ast_c.Compound statxs, ii -> + | Ast_c.Compound statxs -> (* flow_to_ast: *) let (i1, i2) = tuple_of_list2 ii in @@ -344,7 +353,7 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = (* ------------------------- *) - | Labeled (Ast_c.Label (name, st)), ii -> + | Labeled (Ast_c.Label (name, st)) -> let s = Ast_c.str_of_name name in let ilabel = xi.labels_assoc#find s in let node = mk_node (unwrap (!g#nodes#find ilabel)) lbl [] (s ^ ":") in @@ -353,8 +362,8 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = aux_statement (Some ilabel, xi_lbl) st - | Jump (Ast_c.Goto name), ii -> - let s = Ast_c.str_of_name name in + | Jump (Ast_c.Goto name) -> + let s = Ast_c.str_of_name name in (* special_cfg_ast: *) let newi = !g +> add_node (Goto (stmt, name, ((),ii))) lbl ("goto "^s^":") in @@ -378,32 +387,38 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = !g#add_arc ((newi, ilabel), Direct); None - | Jump (Ast_c.GotoComputed e), ii -> + | Jump (Ast_c.GotoComputed e) -> raise (Error (ComputedGoto)) (* ------------------------- *) - | Ast_c.ExprStatement opte, ii -> + | Ast_c.ExprStatement opte -> (* flow_to_ast: old: when opte = None, then do not add in CFG. *) let s = match opte with | None -> "empty;" | Some e -> - let ((unwrap_e, typ), ii) = e in - (match unwrap_e with - | FunCall (((Ident (namef), _typ), _ii), _args) -> - Ast_c.str_of_name namef ^ "(...)" - | Assignment (((Ident (namevar), _typ), _ii), SimpleAssign, e) -> - Ast_c.str_of_name namevar ^ " = ... ;" - | Assignment - (((RecordAccess (((Ident (namevar), _typ), _ii), field), _typ2), - _ii2), - SimpleAssign, - e) -> - let sfield = Ast_c.str_of_name field in - Ast_c.str_of_name namevar ^ "." ^ sfield ^ " = ... ;" - + (match Ast_c.unwrap_expr e with + | FunCall (e, _args) -> + (match Ast_c.unwrap_expr e with + | Ident namef -> + Ast_c.str_of_name namef ^ "(...)" + | _ -> "statement" + ) + | Assignment (e1, SimpleAssign, e2) -> + (match Ast_c.unwrap_expr e1 with + | Ident namevar -> + Ast_c.str_of_name namevar ^ " = ... ;" + | RecordAccess(e, field) -> + (match Ast_c.unwrap_expr e with + | Ident namevar -> + let sfield = Ast_c.str_of_name field in + Ast_c.str_of_name namevar ^ "." ^ sfield ^ " = ... ;" + | _ -> "statement" + ) + | _ -> "statement" + ) | _ -> "statement" - ) + ) in let newi = !g +> add_node (ExprStatement (stmt, (opte, ii))) lbl s in !g +> add_arc_opt (starti, newi); @@ -411,7 +426,11 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = (* ------------------------- *) - | Selection (Ast_c.If (e, st1, (Ast_c.ExprStatement (None), []))), ii -> + | Selection (Ast_c.If (e, st1, st2)) -> + + let iist2 = Ast_c.get_ii_st_take_care st2 in + (match Ast_c.unwrap_st st2 with + | Ast_c.ExprStatement (None) when null iist2 -> (* sometome can have ExprStatement None but it is a if-then-else, * because something like if() xx else ; * so must force to have [] in the ii associated with ExprStatement @@ -448,8 +467,7 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = !g +> add_arc_opt (finalthen, lasti); Some lasti - - | Selection (Ast_c.If (e, st1, st2)), ii -> + | _unwrap_st2 -> (* starti -> newi ---> newfakethen -> ... -> finalthen --> lasti * | | * |-> newfakeelse -> ... -> finalelse -| @@ -489,10 +507,10 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = !g +> add_arc_opt (finalelse, lasti); Some lasti end) - + ) (* ------------------------- *) - | Selection (Ast_c.Switch (e, st)), ii -> + | Selection (Ast_c.Switch (e, st)) -> let (i1,i2,i3, iifakeend) = tuple_of_list4 ii in let ii = [i1;i2;i3] in @@ -510,9 +528,10 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = * information build inside the compound case: the nodei of { *) let finalthen = - match st with - | Ast_c.Compound statxs, ii -> - let statxs = Ast_c.stmt_elems_of_sequencable statxs in + match Ast_c.unwrap_st st with + | Ast_c.Compound statxs -> + + let statxs = Lib.stmt_elems_of_sequencable statxs in (* todo? we should not allow to match a stmt that corresponds * to a compound of a switch, so really SeqStart (stmt, ...) @@ -530,9 +549,10 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = * between start to end. * todo? except if the case[range] coverthe whole spectrum *) - if not (statxs +> List.exists (function - | (Labeled (Ast_c.Default _), _) -> true - | _ -> false + if not (statxs +> List.exists (fun x -> + match Ast_c.unwrap_st x with + | Labeled (Ast_c.Default _) -> true + | _ -> false )) then begin (* when there is no default, then a valid path is @@ -555,7 +575,15 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = } in aux_statement (None (* no starti *), newxi) st - | x -> raise Impossible + | _x -> + (* apparently gcc allows some switch body such as + * switch (i) case 0 : printf("here\n"); + * cf tests-bis/switch_no_body.c + * but I don't think it's worthwile to handle + * such pathological and rare case. Not worth + * the complexity. Safe to assume a coumpound. + *) + raise (Error (WeirdSwitch (pinfo_of_ii [i1]))) in !g +> add_arc_opt (finalthen, newendswitch); @@ -596,13 +624,13 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = res - | Labeled (Ast_c.Case (_, _)), ii - | Labeled (Ast_c.CaseRange (_, _, _)), ii -> + | Labeled (Ast_c.Case (_, _)) + | Labeled (Ast_c.CaseRange (_, _, _)) -> incr counter_for_switch; let switchrank = !counter_for_switch in let node, st = - match stmt with + match Ast_c.get_st_and_ii stmt with | Labeled (Ast_c.Case (e, st)), ii -> (Case (stmt, (e, ii))), st | Labeled (Ast_c.CaseRange (e, e2, st)), ii -> @@ -636,7 +664,7 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = aux_statement (Some newi, xi_lbl) st - | Labeled (Ast_c.Default st), ii -> + | Labeled (Ast_c.Default st) -> incr counter_for_switch; let switchrank = !counter_for_switch in @@ -659,7 +687,7 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = (* ------------------------- *) - | Iteration (Ast_c.While (e, st)), ii -> + | Iteration (Ast_c.While (e, st)) -> (* starti -> newi ---> newfakethen -> ... -> finalthen - * |---|-----------------------------------| * |-> newfakelse @@ -694,13 +722,13 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = * (whereas While cant return None). But if return None, certainly * some deadcode. *) - | Iteration (Ast_c.DoWhile (st, e)), ii -> + | Iteration (Ast_c.DoWhile (st, e)) -> (* starti -> doi ---> ... ---> finalthen (opt) ---> whiletaili * |--------- newfakethen ---------------| |---> newfakelse *) let is_zero = match Ast_c.unwrap_expr e with - | Constant (Int "0") -> true + | Constant (Int ("0",_)) -> true | _ -> false in @@ -750,7 +778,7 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = - | Iteration (Ast_c.For (e1opt, e2opt, e3opt, st)), ii -> + | Iteration (Ast_c.For (e1opt, e2opt, e3opt, st)) -> let (i1,i2,i3, iifakeend) = tuple_of_list4 ii in let ii = [i1;i2;i3] in @@ -785,7 +813,7 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = * lexer, now they are returned as Twhile so less pbs. But not perfect. * update: now I recognize the list_for_each macro so no more problems. *) - | Iteration (Ast_c.MacroIteration (s, es, st)), ii -> + | Iteration (Ast_c.MacroIteration (s, es, st)) -> let (i1,i2,i3, iifakeend) = tuple_of_list4 ii in let ii = [i1;i2;i3] in @@ -814,7 +842,7 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = (* ------------------------- *) - | Jump ((Ast_c.Continue|Ast_c.Break) as x),ii -> + | Jump ((Ast_c.Continue|Ast_c.Break) as x) -> let context_info = match xi.ctx with SwitchInfo (startbrace, loopendi, braces, parent_lbl) -> @@ -883,7 +911,7 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = | NoInfo -> raise Impossible ) - | Jump ((Ast_c.Return | Ast_c.ReturnExpr _) as kind), ii -> + | Jump ((Ast_c.Return | Ast_c.ReturnExpr _) as kind) -> (match xi.exiti, xi.errorexiti with | None, None -> raise (Error (NoExit (pinfo_of_ii ii))) | Some exiti, Some errorexiti -> @@ -917,7 +945,7 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = (* ------------------------- *) - | Ast_c.Decl decl, ii -> + | Ast_c.Decl decl -> let s = match decl with | (Ast_c.DeclList @@ -931,19 +959,19 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) = Some newi (* ------------------------- *) - | Ast_c.Asm body, ii -> + | Ast_c.Asm body -> let newi = !g +> add_node (Asm (stmt, ((body,ii)))) lbl "asm;" in !g +> add_arc_opt (starti, newi); Some newi - | Ast_c.MacroStmt, ii -> + | Ast_c.MacroStmt -> let newi = !g +> add_node (MacroStmt (stmt, ((),ii))) lbl "macro;" in !g +> add_arc_opt (starti, newi); Some newi (* ------------------------- *) - | Ast_c.NestedFunc def, ii -> + | Ast_c.NestedFunc def -> raise (Error NestedFunc) @@ -1028,7 +1056,7 @@ let (aux_definition: nodei -> definition -> unit) = fun topi funcdef -> ) in - let topstatement = Ast_c.Compound compound, iicompound in + let topstatement = Ast_c.mk_st (Ast_c.Compound compound) iicompound in let headi = !g +> add_node (FunHeader ({ @@ -1072,13 +1100,15 @@ let (aux_definition: nodei -> definition -> unit) = fun topi funcdef -> * the toplevel macro statement as in @@ toplevel_declarator MACRO_PARAM;@@ * and so I would not need this hack and instead I would to a cleaner * match in cocci_vs_c_3.ml of a A.MacroTop vs B.MacroTop + * + * todo: update: now I do what I just described, so can remove this code ? *) let specialdeclmacro_to_stmt (s, args, ii) = let (iis, iiopar, iicpar, iiptvirg) = tuple_of_list4 ii in let ident = Ast_c.RegularName (s, [iis]) in - let identfinal = (Ast_c.Ident (ident), Ast_c.noType()), [] in - let f = (Ast_c.FunCall (identfinal, args), Ast_c.noType()), [iiopar;iicpar] in - let stmt = Ast_c.ExprStatement (Some f), [iiptvirg] in + let identfinal = Ast_c.mk_e (Ast_c.Ident (ident)) Ast_c.noii in + let f = Ast_c.mk_e (Ast_c.FunCall (identfinal, args)) [iiopar;iicpar] in + let stmt = Ast_c.mk_st (Ast_c.ExprStatement (Some f)) [iiptvirg] in stmt, (f, [iiptvirg]) @@ -1187,6 +1217,18 @@ let ast_to_control_flow e = raise (Error(Define(pinfo_of_ii ii))) | Ast_c.DefineTodo -> raise (Error(Define(pinfo_of_ii ii))) + +(* old: + | Ast_c.DefineText (s, ii) -> + let endi = !g +> add_node EndNode lbl_0 "[end]" in + !g#add_arc ((headeri, endi),Direct); + | Ast_c.DefineInit _ -> + let endi = !g +> add_node EndNode lbl_0 "[end]" in + !g#add_arc ((headeri, endi),Direct); + | Ast_c.DefineTodo -> + let endi = !g +> add_node EndNode lbl_0 "[end]" in + !g#add_arc ((headeri, endi),Direct); +*) ); Some !g @@ -1256,7 +1298,9 @@ let deadcode_detection g = | SeqEnd _ -> () (* todo?: certaines '}' deviennent orphelins *) | x -> (match Control_flow_c.extract_fullstatement node with - | Some (st, ii) -> raise (Error (DeadCode (Some (pinfo_of_ii ii)))) + | Some st -> + let ii = Ast_c.get_ii_st_take_care st in + raise (Error (DeadCode (Some (pinfo_of_ii ii)))) | _ -> pr2 "CFG: orphelin nodes, maybe something weird happened" ) ) @@ -1358,6 +1402,8 @@ let report_error error = pr2 ("FLOW: case without corresponding switch: " ^ error_from_info info) | OnlyBreakInSwitch info -> pr2 ("FLOW: only break are allowed in switch: " ^ error_from_info info) + | WeirdSwitch info -> + pr2 ("FLOW: weird switch: " ^ error_from_info info) | NoEnclosingLoop (info) -> pr2 ("FLOW: can't find enclosing loop: " ^ error_from_info info) | GotoCantFindLabel (s, info) -> @@ -1365,7 +1411,7 @@ let report_error error = | NoExit info -> pr2 ("FLOW: can't find exit or error exit: " ^ error_from_info info) | DuplicatedLabel s -> - pr2 ("FLOW: duplicate label" ^ s) + pr2 ("FLOW: duplicate label " ^ s) | NestedFunc -> pr2 ("FLOW: not handling yet nested function") | ComputedGoto -> diff --git a/parsing_c/ast_to_flow.mli b/parsing_c/control_flow_c_build.mli similarity index 94% rename from parsing_c/ast_to_flow.mli rename to parsing_c/control_flow_c_build.mli index 52b2ffa..2b84821 100644 --- a/parsing_c/ast_to_flow.mli +++ b/parsing_c/control_flow_c_build.mli @@ -10,6 +10,7 @@ type error = | DeadCode of Common.parse_info option | CaseNoSwitch of Common.parse_info | OnlyBreakInSwitch of Common.parse_info + | WeirdSwitch of Common.parse_info | NoEnclosingLoop of Common.parse_info | GotoCantFindLabel of string * Common.parse_info | NoExit of Common.parse_info diff --git a/parsing_c/cpp_ast_c.ml b/parsing_c/cpp_ast_c.ml index af246f2..ae2ce2c 100644 --- a/parsing_c/cpp_ast_c.ml +++ b/parsing_c/cpp_ast_c.ml @@ -15,6 +15,13 @@ open Common open Ast_c +(*****************************************************************************) +(* Wrappers *) +(*****************************************************************************) +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_cpp_ast +let pr2_debug,pr2_debug_once = + Common.mk_pr2_wrappers Flag_parsing_c.debug_cpp_ast + (*****************************************************************************) (* Cpp Ast Manipulations *) (*****************************************************************************) @@ -103,7 +110,7 @@ let init_adjust_candidate_header_files dir = files +> List.iter (fun file -> let base = Filename.basename file in - pr2 file; + pr2_debug file; Hashtbl.add _hcandidates base file; ); () @@ -144,7 +151,7 @@ let find_header_file2 inc_file = let res = Hashtbl.find_all _hcandidates base in (match res with | [file] -> - pr2 ("CPPAST: find header in other dir: " ^ file); + pr2_debug ("CPPAST: find header in other dir: " ^ file); res | [] -> [] @@ -166,7 +173,7 @@ let find_header_file cppopts dirname inc_file = (* ---------------------------------------------------------------------- *) let trace_cpp_process depth mark inc_file = - pr2 (spf "%s>%s %s" + pr2_debug (spf "%s>%s %s" (Common.repeat "-" depth +> Common.join "") mark (s_of_inc_file_bis inc_file)); @@ -221,7 +228,9 @@ let (cpp_expand_include2: cpp_option list -> Common.dirname -> Ast_c.program -> Ast_c.program) = fun ?(depth_limit=None) iops dirname ast -> - pr2_xxxxxxxxxxxxxxxxx(); + if !Flag_parsing_c.debug_cpp_ast + then pr2_xxxxxxxxxxxxxxxxx(); + let already_included = ref [] in let rec aux stack dirname ast = diff --git a/parsing_c/cpp_token_c.ml b/parsing_c/cpp_token_c.ml new file mode 100644 index 0000000..5ad5de6 --- /dev/null +++ b/parsing_c/cpp_token_c.ml @@ -0,0 +1,639 @@ +(* Yoann Padioleau + * + * Copyright (C) 2007, 2008 Ecole des Mines de Nantes + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License (GPL) + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * file license.txt for more details. + *) + +open Common + +module TH = Token_helpers + +open Parser_c +open Token_views_c + +(*****************************************************************************) +(* Prelude *) +(*****************************************************************************) + +(* cpp functions working at the token level. Cf cpp_ast_c for cpp functions + * working at the AST level (which is very unusual but makes sense in + * the coccinelle context for instance). + * + * Note that as I use a single lexer to work both at the C and cpp level + * there are some inconveniencies. + * For instance 'for' is a valid name for a macro parameter and macro + * body, but is interpreted in a special way by our single lexer, and + * so at some places where I expect a TIdent I need also to + * handle special cases and accept Tfor, Tif, etc at those places. + * + * There are multiple issues related to those keywords incorrect tokens. + * Those keywords can be: + * - (1) in the name of the macro as in #define inline + * - (2) in a parameter of the macro as in #define foo(char) char x; + * - (3) in an argument to a macro call as in IDENT(if); + * Case 1 is easy to fix in define_ident. + * Case 2 is easy to fix in define_parse where detect such toks in + * the parameter and then replace their occurence in the body in a Tident. + * Case 3 is only an issue when the expanded token is not really use + * as usual but use for instance in concatenation as in a ## if + * when expanded. In the case the grammar this time will not be happy + * so this is also easy to fix in cpp_engine. + * + *) + +(*****************************************************************************) +(* Wrappers *) +(*****************************************************************************) +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_parsing + +(*****************************************************************************) +(* Types *) +(*****************************************************************************) + + +(* ------------------------------------------------------------------------- *) +(* mimic standard.h *) +(* ------------------------------------------------------------------------- *) + +type define_def = string * define_param * define_body + and define_param = + | NoParam + | Params of string list + and define_body = + | DefineBody of Parser_c.token list + | DefineHint of parsinghack_hint + + and parsinghack_hint = + | HintIterator + | HintDeclarator + | HintMacroString + | HintMacroStatement + | HintAttribute + | HintMacroIdentBuilder + + + +(* cf also data/test.h *) +let assoc_hint_string = [ + "YACFE_ITERATOR" , HintIterator; + "YACFE_DECLARATOR" , HintDeclarator; + "YACFE_STRING" , HintMacroString; + "YACFE_STATEMENT" , HintMacroStatement; + "YACFE_ATTRIBUTE" , HintAttribute; + "YACFE_IDENT_BUILDER" , HintMacroIdentBuilder; + + "MACROSTATEMENT" , HintMacroStatement; (* backward compatibility *) +] + + +let (parsinghack_hint_of_string: string -> parsinghack_hint option) = fun s -> + Common.assoc_option s assoc_hint_string + +let (is_parsinghack_hint: string -> bool) = fun s -> + parsinghack_hint_of_string s <> None + +let (token_from_parsinghack_hint: + (string * Ast_c.info) -> parsinghack_hint -> Parser_c.token) = + fun (s,ii) hint -> + match hint with + | HintIterator -> + Parser_c.TMacroIterator (s, ii) + | HintDeclarator -> + Parser_c.TMacroDecl (s, ii) + | HintMacroString -> + Parser_c.TMacroString (s, ii) + | HintMacroStatement -> + Parser_c.TMacroStmt (s, ii) + | HintAttribute -> + Parser_c.TMacroAttr (s, ii) + | HintMacroIdentBuilder -> + Parser_c.TMacroIdentBuilder (s, ii) + + + + + + +(*****************************************************************************) +(* Expansion helpers *) +(*****************************************************************************) + +(* In some cases we can have macros like IDENT(if) that expands to some + * 'int xxx_if(void)', but as the lexer will currently generate a Tif for + * the expanded code, that may not be accepted as a token after a ## + * in the grammar. Hence this function to remap some tokens. This is because + * we should not use a single lexer for both working at the C level and + * cpp level. + * + * update: it can also rename some TypedefIdent into TIdent, possibly + * because of bad interaction with add_typedef_root in parsing_hacks. + *) +let rec remap_keyword_tokens xs = + match xs with + | [] -> [] + | [x] -> [x] + | x::y::xs -> + (match x, y with + | Parser_c.TCppConcatOp _, Parser_c.TIdent _ -> + x::y::remap_keyword_tokens xs + | Parser_c.TIdent _, Parser_c.TCppConcatOp _ -> + x::y::remap_keyword_tokens xs + + | Parser_c.TCppConcatOp (i1), y -> + + let s = TH.str_of_tok y in + let ii = TH.info_of_tok y in + if s ==~ Common.regexp_alpha + then begin + pr2 (spf "remaping: %s to an ident in expanded code" s); + x::(Parser_c.TIdent (s, ii))::remap_keyword_tokens xs + end + else + x::y::remap_keyword_tokens xs + + | x, Parser_c.TCppConcatOp (i1) -> + let s = TH.str_of_tok x in + let ii = TH.info_of_tok x in + if s ==~ Common.regexp_alpha + then begin + pr2 (spf "remaping: %s to an ident in expanded code" s); + (Parser_c.TIdent (s, ii))::remap_keyword_tokens (y::xs) + end + else + x::y::remap_keyword_tokens xs + + | _, _ -> + x::remap_keyword_tokens (y::xs) + ) + + + +(* To expand the parameter of the macro. The env corresponds to the actual + * code that is binded to the parameters of the macro. + * Recurse ? fixpoint ? the expansion may also contain macro. + * Or to macro expansion in a strict manner, that is process first + * the parameters, expands macro in params, and then process enclosing + * macro call. + * + * note: do the concatenation job of a##b here ? + * normally this should be done in the grammar. Here just expand + * tokens. The only thing we handle here is we may have to remap + * some tokens. + * + * todo: handle stringification here ? if #n + * + * todo? but could parsing_hacks then pass over the remapped tokens, + * for instance transform some of the back into some TypedefIdent + * so cpp_engine may be fooled? + *) +let rec (cpp_engine: (string , Parser_c.token list) assoc -> + Parser_c.token list -> Parser_c.token list) = + fun env xs -> + xs +> List.map (fun tok -> + (* expand only TIdent ? no cos the parameter of the macro + * can actually be some 'register' so may have to look for + * any tokens candidates for the expansion. + * Only subtelity is maybe dont expand the TDefineIdent. + * update: in fact now the caller (define_parse) will have done + * the job right and already replaced the macro parameter with a TIdent. + *) + match tok with + | TIdent (s,i1) when List.mem_assoc s env -> Common.assoc s env + | x -> [x] + ) + +> List.flatten + +> remap_keyword_tokens + + + +(* ------------------------------------------------------------------------- *) +(* apply macro, using standard.h or other defs *) +(* ------------------------------------------------------------------------- *) + +(* Thanks to this function many stuff are not anymore hardcoded in ocaml code. + * At some point there were hardcoded in a standard.h file but now I + * can even generate them on the fly on demand when there is actually + * a parsing problem. + * + * No need to take care to not substitute the macro name itself + * that occurs in the macro definition because the macro name is + * after fix_token_define a TDefineIdent, no more a TIdent. + *) + +let rec apply_macro_defs + ~msg_apply_known_macro + ~msg_apply_known_macro_hint + defs xs = + let rec apply_macro_defs xs = + match xs with + | [] -> () + + (* old: "but could do more, could reuse same original token + * so that have in the Ast a Dbg, not a MACROSTATEMENT" + * + * | PToken ({tok = TIdent (s,i1)} as id)::xs + * when s = "MACROSTATEMENT" -> + * + * msg_macro_statement_hint s; + * id.tok <- TMacroStmt(TH.info_of_tok id.tok); + * find_macro_paren xs + * + * let msg_macro_statement_hint s = + * incr Stat.nMacroHint; + * () + * + *) + + (* recognized macro of standard.h (or other) *) + | PToken ({tok = TIdent (s,i1)} as id)::Parenthised (xxs,info_parens)::xs + when Hashtbl.mem defs s -> + + msg_apply_known_macro s; + let (s, params, body) = Hashtbl.find defs s in + + (match params with + | NoParam -> + pr2 ("WEIRD: macro without param used before parenthize: " ^ s); + (* ex: PRINTP("NCR53C400 card%s detected\n" ANDP(((struct ... *) + + (match body with + | DefineBody bodymacro -> + set_as_comment (Token_c.CppMacro) id; + id.new_tokens_before <- bodymacro; + | DefineHint hint -> + msg_apply_known_macro_hint s; + id.tok <- token_from_parsinghack_hint (s,i1) hint; + ) + | Params params -> + (match body with + | DefineBody bodymacro -> + + (* bugfix: better to put this that before the match body, + * cos our macrostatement hint can have variable number of + * arguments and so it's ok if it does not match exactly + * the number of arguments. *) + if List.length params != List.length xxs + then begin + pr2_once ("WEIRD: macro with wrong number of arguments: " ^ s); + (* old: id.new_tokens_before <- bodymacro; *) + + (* update: if wrong number, then I just pass this macro *) + [Parenthised (xxs, info_parens)] +> + iter_token_paren (set_as_comment Token_c.CppMacro); + set_as_comment Token_c.CppMacro id; + + () + end + else + + let xxs' = xxs +> List.map (fun x -> + (tokens_of_paren_ordered x) +> List.map (fun x -> + TH.visitor_info_of_tok Ast_c.make_expanded x.tok + ) + ) in + id.new_tokens_before <- + (* !!! cpp expansion job here !!! *) + cpp_engine (Common.zip params xxs') bodymacro; + + (* important to do that after have apply the macro, otherwise + * will pass as argument to the macro some tokens that + * are all TCommentCpp + *) + [Parenthised (xxs, info_parens)] +> + iter_token_paren (set_as_comment Token_c.CppMacro); + set_as_comment Token_c.CppMacro id; + + | DefineHint (HintMacroStatement as hint) -> + (* important to do that after have apply the macro, otherwise + * will pass as argument to the macro some tokens that + * are all TCommentCpp + * + * note: such macrostatement can have a variable number of + * arguments but here we don't care, we just pass all the + * parameters. + *) + + (match xs with + | PToken ({tok = TPtVirg _} as id2)::_ -> + pr2_once + ("macro stmt with trailing ';', passing also ';' for: "^ + s); + (* sometimes still want pass its params ... as in + * DEBUGPOLL(static unsigned int prev_mask = 0); + *) + + msg_apply_known_macro_hint s; + id.tok <- token_from_parsinghack_hint (s,i1) hint; + [Parenthised (xxs, info_parens)] +> + iter_token_paren (set_as_comment Token_c.CppMacro); + set_as_comment Token_c.CppMacro id2; + + | _ -> + msg_apply_known_macro_hint s; + id.tok <- token_from_parsinghack_hint (s,i1) hint; + [Parenthised (xxs, info_parens)] +> + iter_token_paren (set_as_comment Token_c.CppMacro); + ) + + + | DefineHint hint -> + msg_apply_known_macro_hint s; + id.tok <- token_from_parsinghack_hint (s,i1) hint; + ) + ); + apply_macro_defs xs + + | PToken ({tok = TIdent (s,i1)} as id)::xs + when Hashtbl.mem defs s -> + + msg_apply_known_macro s; + let (_s, params, body) = Hashtbl.find defs s in + + (match params with + | Params params -> + pr2 ("WEIRD: macro with params but no parens found: " ^ s); + (* dont apply the macro, perhaps a redefinition *) + () + | NoParam -> + (match body with + | DefineBody [newtok] -> + (* special case when 1-1 substitution, we reuse the token *) + id.tok <- (newtok +> TH.visitor_info_of_tok (fun _ -> + TH.info_of_tok id.tok)) + | DefineBody bodymacro -> + set_as_comment Token_c.CppMacro id; + id.new_tokens_before <- bodymacro; + | DefineHint hint -> + msg_apply_known_macro_hint s; + id.tok <- token_from_parsinghack_hint (s,i1) hint; + ) + ); + apply_macro_defs xs + + + + + (* recurse *) + | (PToken x)::xs -> apply_macro_defs xs + | (Parenthised (xxs, info_parens))::xs -> + xxs +> List.iter apply_macro_defs; + apply_macro_defs xs + in + apply_macro_defs xs + + + + +(*****************************************************************************) +(* The parsing hack for #define *) +(*****************************************************************************) + +(* To parse macro definitions I need to do some tricks + * as some information can be get only at the lexing level. For instance + * the space after the name of the macro in '#define foo (x)' is meaningful + * but the grammar can not get this information. So define_ident below + * look at such space and generate a special TOpardefine. In a similar + * way macro definitions can contain some antislash and newlines + * and the grammar need to know where the macro ends (which is + * a line-level and so low token-level information). Hence the + * function 'define_line' below and the TDefEol. + * + * update: TDefEol is handled in a special way at different places, + * a little bit like EOF, especially for error recovery, so this + * is an important token that should not be retagged! + * + * + * ugly hack, a better solution perhaps would be to erase TDefEOL + * from the Ast and list of tokens in parse_c. + * + * note: I do a +1 somewhere, it's for the unparsing to correctly sync. + * + * note: can't replace mark_end_define by simply a fakeInfo(). The reason + * is where is the \n TCommentSpace. Normally there is always a last token + * to synchronize on, either EOF or the token of the next toplevel. + * In the case of the #define we got in list of token + * [TCommentSpace "\n"; TDefEOL] but if TDefEOL is a fakeinfo then we will + * not synchronize on it and so we will not print the "\n". + * A solution would be to put the TDefEOL before the "\n". + * + * todo?: could put a ExpandedTok for that ? + *) +let mark_end_define ii = + let ii' = + { Ast_c.pinfo = Ast_c.OriginTok { (Ast_c.parse_info_of_info ii) with + Common.str = ""; + Common.charpos = Ast_c.pos_of_info ii + 1 + }; + cocci_tag = ref Ast_c.emptyAnnot; + comments_tag = ref Ast_c.emptyComments; + } + in + TDefEOL (ii') + +(* put the TDefEOL at the good place *) +let rec define_line_1 acc xs = + match xs with + | [] -> List.rev acc + | TDefine ii::xs -> + let line = Ast_c.line_of_info ii in + let acc = (TDefine ii) :: acc in + define_line_2 acc line ii xs + | TCppEscapedNewline ii::xs -> + pr2 "WEIRD: a \\ outside a #define"; + let acc = (TCommentSpace ii) :: acc in + define_line_1 acc xs + | x::xs -> define_line_1 (x::acc) xs + +and define_line_2 acc line lastinfo xs = + match xs with + | [] -> + (* should not happened, should meet EOF before *) + pr2 "PB: WEIRD"; + List.rev (mark_end_define lastinfo::acc) + | x::xs -> + let line' = TH.line_of_tok x in + let info = TH.info_of_tok x in + + (match x with + | EOF ii -> + let acc = (mark_end_define lastinfo) :: acc in + let acc = (EOF ii) :: acc in + define_line_1 acc xs + | TCppEscapedNewline ii -> + if (line' <> line) then pr2 "PB: WEIRD: not same line number"; + let acc = (TCommentSpace ii) :: acc in + define_line_2 acc (line+1) info xs + | x -> + if line' =|= line + then define_line_2 (x::acc) line info xs + else define_line_1 (mark_end_define lastinfo::acc) (x::xs) + ) + +let rec define_ident acc xs = + match xs with + | [] -> List.rev acc + | TDefine ii::xs -> + let acc = TDefine ii :: acc in + (match xs with + | TCommentSpace i1::TIdent (s,i2)::TOPar (i3)::xs -> + (* Change also the kind of TIdent to avoid bad interaction + * with other parsing_hack tricks. For instant if keep TIdent then + * the stringication algo can believe the TIdent is a string-macro. + * So simpler to change the kind of the ident too. + *) + (* if TOParDefine sticked to the ident, then + * it's a macro-function. Change token to avoid ambiguity + * between #define foo(x) and #define foo (x) + *) + let acc = (TCommentSpace i1) :: acc in + let acc = (TIdentDefine (s,i2)) :: acc in + let acc = (TOParDefine i3) :: acc in + define_ident acc xs + + | TCommentSpace i1::TIdent (s,i2)::xs -> + let acc = (TCommentSpace i1) :: acc in + let acc = (TIdentDefine (s,i2)) :: acc in + define_ident acc xs + + (* bugfix: ident of macro (as well as params, cf below) can be tricky + * note, do we need to subst in the body of the define ? no cos + * here the issue is the name of the macro, as in #define inline, + * so obviously the name of this macro will not be used in its + * body (it would be a recursive macro, which is forbidden). + *) + + | TCommentSpace i1::t::xs -> + + let s = TH.str_of_tok t in + let ii = TH.info_of_tok t in + if s ==~ Common.regexp_alpha + then begin + pr2 (spf "remaping: %s to an ident in macro name" s); + let acc = (TCommentSpace i1) :: acc in + let acc = (TIdentDefine (s,ii)) :: acc in + define_ident acc xs + end + else begin + pr2 "WEIRD: weird #define body"; + define_ident acc xs + end + + | _ -> + pr2 "WEIRD: weird #define body"; + define_ident acc xs + ) + | x::xs -> + let acc = x :: acc in + define_ident acc xs + + + +let fix_tokens_define2 xs = + define_ident [] (define_line_1 [] xs) + +let fix_tokens_define a = + Common.profile_code "C parsing.fix_define" (fun () -> fix_tokens_define2 a) + + + +(*****************************************************************************) +(* for the cpp-builtin, standard.h, part 0 *) +(*****************************************************************************) + +let macro_body_to_maybe_hint body = + match body with + | [] -> DefineBody body + | [TIdent (s,i1)] -> + (match parsinghack_hint_of_string s with + | Some hint -> DefineHint hint + | None -> DefineBody body + ) + | xs -> DefineBody body + + +let rec define_parse xs = + match xs with + | [] -> [] + | TDefine i1::TIdentDefine (s,i2)::TOParDefine i3::xs -> + (* note: the macro could be badly written and have no closing ')' for + * its param, which would make us go too far away, but I don't think + * it's important to handle such an error *) + let (tokparams, _, xs) = + xs +> Common.split_when (function TCPar _ -> true | _ -> false) in + let (body, _, xs) = + xs +> Common.split_when (function TDefEOL _ -> true | _ -> false) in + let params = + tokparams +> Common.map_filter (function + | TComma _ -> None + | TIdent (s, _) -> Some s + + (* TODO *) + | TDefParamVariadic (s, _) -> Some s + (* TODO *) + | TEllipsis _ -> Some "..." + + | x -> + (* bugfix: param of macros can be tricky *) + let s = TH.str_of_tok x in + if s ==~ Common.regexp_alpha + then begin + pr2 (spf "remaping: %s to a macro parameter" s); + Some s + end + else + error_cant_have x + ) in + (* bugfix: also substitute to ident in body so cpp_engine will + * have an easy job. + *) + let body = body +> List.map (fun tok -> + match tok with + | TIdent _ -> tok + | _ -> + let s = TH.str_of_tok tok in + let ii = TH.info_of_tok tok in + if s ==~ Common.regexp_alpha && List.mem s params + then begin + pr2 (spf "remaping: %s to an ident in macro body" s); + TIdent (s, ii) + end + else tok + ) +> List.map (TH.visitor_info_of_tok Ast_c.make_expanded) in + let def = (s, (s, Params params, macro_body_to_maybe_hint body)) in + def::define_parse xs + + | TDefine i1::TIdentDefine (s,i2)::xs -> + let (body, _, xs) = + xs +> Common.split_when (function TDefEOL _ -> true | _ -> false) in + let body = body +> List.map + (TH.visitor_info_of_tok Ast_c.make_expanded) in + let def = (s, (s, NoParam, macro_body_to_maybe_hint body)) in + def::define_parse xs + + (* cf tests-bis/define_plus.c *) + | TDefine i1::xs -> + let line = Ast_c.line_of_info i1 in + pr2 (spf "WEIRD: no ident in define at line %d" line); + define_parse xs + + | x::xs -> define_parse xs + + + +let extract_cpp_define xs = + let cleaner = xs +> List.filter (fun x -> + not (TH.is_comment x) + ) in + define_parse cleaner + + + + diff --git a/parsing_c/cpp_token_c.mli b/parsing_c/cpp_token_c.mli new file mode 100644 index 0000000..6d5cb99 --- /dev/null +++ b/parsing_c/cpp_token_c.mli @@ -0,0 +1,46 @@ +(* + * Do stuff involving cpp macros, like expanding some macros, + * or try to parse well the body of the define by finding the end of + * define virtual end-of-line token. + *) + +(* corresponds to what is in the yacfe configuration file (e.g. standard.h) *) +type define_def = string * define_param * define_body + and define_param = + | NoParam + | Params of string list + and define_body = + | DefineBody of Parser_c.token list + | DefineHint of parsinghack_hint + + (* strongly corresponds to the TMacroXxx in the grammar and lexer and the + * MacroXxx in the ast. + *) + and parsinghack_hint = + | HintIterator + | HintDeclarator + | HintMacroString + | HintMacroStatement + | HintAttribute + | HintMacroIdentBuilder + +(* This function work by side effect and may generate new tokens + * in the new_tokens_before field of the token_extended in the + * paren_grouped list. So don't forget to recall + * Token_views_c.rebuild_tokens_extented after this call, as well + * as probably parsing_hacks.insert_virtual_positions as new tokens + * are generated. + *) +val apply_macro_defs: + msg_apply_known_macro:(string -> unit) -> + msg_apply_known_macro_hint:(string -> unit) -> + (string, define_def) Hashtbl.t -> + Token_views_c.paren_grouped list -> unit + +(* generate virtual end-of-line token *) +val fix_tokens_define : + Parser_c.token list -> Parser_c.token list + +val extract_cpp_define : + Parser_c.token list -> (string, define_def) Common.assoc + diff --git a/parsing_c/flag_parsing_c.ml b/parsing_c/flag_parsing_c.ml index 2ee65f7..cfdeceb 100644 --- a/parsing_c/flag_parsing_c.ml +++ b/parsing_c/flag_parsing_c.ml @@ -1,17 +1,28 @@ (*****************************************************************************) -(* convenient globals to pass to parse_c.init_defs *) +(* convenient globals. *) (*****************************************************************************) let path = ref (try (Sys.getenv "YACFE_HOME") with Not_found-> "/home/pad/c-yacfe" ) -let std_h = ref (Filename.concat !path "data/standard.h") -let common_h = ref (Filename.concat !path "data/common_macros.h") + +(*****************************************************************************) +(* macros *) +(*****************************************************************************) + +let macro_dir = "config/macros/" +let mk_macro_path ~cocci_path file = + Filename.concat cocci_path (macro_dir ^ file) + + +(* to pass to parse_c.init_defs *) +let std_h = ref (mk_macro_path ~cocci_path:!path "standard.h") +let common_h = ref (mk_macro_path ~cocci_path:!path "common_macros.h") let cmdline_flags_macrofile () = [ - "-macro_file", Arg.Set_string std_h, + "-macro_file_builtins", Arg.Set_string std_h, " (default=" ^ !std_h ^ ")"; ] @@ -40,6 +51,11 @@ let cmdline_flags_envfile () = " (default=" ^ !std_envir ^ ")"; ] +(*****************************************************************************) +(* show *) +(*****************************************************************************) + +let show_parsing_error = ref true (*****************************************************************************) (* verbose *) @@ -48,7 +64,11 @@ let cmdline_flags_envfile () = let verbose_lexing = ref true let verbose_parsing = ref true let verbose_type = ref true +let verbose_cfg = ref true let verbose_annotater = ref true +let verbose_unparsing = ref true +let verbose_visit = ref true +let verbose_cpp_ast = ref true let filter_msg = ref false let filter_msg_define_error = ref false @@ -59,6 +79,7 @@ let filter_passed_level = ref 0 let pretty_print_type_info = ref false let pretty_print_comment_info = ref false +let pretty_print_typedef_value = ref false (* cocci specific *) let show_flow_labels = ref true @@ -94,6 +115,8 @@ let debug_etdt = ref false let debug_typedef = ref false let debug_cpp = ref false +let debug_cpp_ast = ref false + let debug_unparsing = ref false let debug_cfg = ref false @@ -140,7 +163,7 @@ let cmdline_flags_algos () = let cpp_directive_passing = ref false let ifdef_directive_passing = ref false -let disable_two_pass = ref false +let disable_multi_pass = ref false let disable_add_typedef = ref false let if0_passing = ref true @@ -158,7 +181,7 @@ let cmdline_flags_parsing_algos () = [ "-noadd_typedef_root", Arg.Clear add_typedef_root, " "; "-noadd_typedef", Arg.Set disable_add_typedef, " "; - "-disable_two_pass", Arg.Set disable_two_pass, " "; + "-disable_multi_pass", Arg.Set disable_multi_pass, " "; ] (*****************************************************************************) @@ -181,3 +204,49 @@ let cmdline_flags_other () = ] (*****************************************************************************) +(* for lexing of integer constants *) +(*****************************************************************************) + +let int_thresholds = + ref (None : + (int (*int_sz*) * int (*long_sz*) * + Big_int.big_int (*uint threshold*) * + Big_int.big_int (*long threshold*) * + Big_int.big_int (*ulong threshold*)) option) + +let set_int_bits n = + match !int_thresholds with + None -> + (*assume long is 2*int; this can be corrected by a subsequent long_bits*) + let uint_threshold = Big_int.power_int_positive_int 2 (n-1) in + let long_threshold = Big_int.power_int_positive_int 2 n in + let ulong_threshold = Big_int.power_int_positive_int 2 ((2*n)-1) in + int_thresholds := + Some (n,2*n,uint_threshold,long_threshold,ulong_threshold) + | Some(int_sz,long_sz,uint_threshold,long_threshold,ulong_threshold) -> + let uint_threshold = Big_int.power_int_positive_int 2 (n-1) in + let long_threshold = Big_int.power_int_positive_int 2 n in + int_thresholds := + Some (n,long_sz,uint_threshold,long_threshold,ulong_threshold) + +let set_long_bits n = + match !int_thresholds with + None -> + (*assume int is 1/2*int; this can be corrected by a subsequent int_bits*) + set_int_bits (n/2) + | Some(int_sz,long_sz,uint_threshold,long_threshold,ulong_threshold) -> + let ulong_threshold = Big_int.power_int_positive_int 2 (n-1) in + int_thresholds := + Some (int_sz,n,uint_threshold,long_threshold,ulong_threshold) + +(*****************************************************************************) +(* unparsing strategy *) +(*****************************************************************************) + +type spacing = LINUX | SMPL +let spacing = ref LINUX + +let set_linux_spacing _ = spacing := LINUX (*follow the conventions of Linux*) +let set_smpl_spacing _ = spacing := SMPL (*use spacing from the SP*) + +(*****************************************************************************) diff --git a/parsing_c/lexer_c.mll b/parsing_c/lexer_c.mll index 6a18e2e..9dacf58 100644 --- a/parsing_c/lexer_c.mll +++ b/parsing_c/lexer_c.mll @@ -45,9 +45,7 @@ open Ast_c (* to factorise tokens, OpAssign, ... *) (*****************************************************************************) (* Wrappers *) (*****************************************************************************) -let pr2 s = - if !Flag_parsing_c.verbose_lexing - then Common.pr2 s +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_lexing (*****************************************************************************) @@ -160,6 +158,59 @@ let keyword_table = Common.hash_of_list [ let error_radix s = ("numeric " ^ s ^ " constant contains digits beyond the radix:") +(* functions for figuring out the type of integers *) + +let is_long_dec s int uint long ulong = + match !Flag_parsing_c.int_thresholds with + None -> int + | Some (_,_,uint_threshold,long_threshold,ulong_threshold) -> + let bn = Big_int.big_int_of_string s in + if Big_int.ge_big_int bn ulong_threshold + then ulong + else + if Big_int.ge_big_int bn long_threshold + then long + else + if Big_int.ge_big_int bn uint_threshold + then long + else int + +let is_long_ho s int uint long ulong drop bpd count = + match !Flag_parsing_c.int_thresholds with + None -> int + | Some (uint_sz,ulong_sz,_,_,_) -> + let len = String.length s in + (* this assumes that all of the hex/oct digits are significant *) + (* drop is 2 for hex (0x) and 1 for oct (0) *) + let s = String.sub s drop (len - drop) in + let len = + ((len-drop) * bpd) - + (count (int_of_string("0x"^(String.sub s 0 1)))) in + if len < uint_sz + then int + else + if len = uint_sz + then uint + else + if len < ulong_sz + then long + else ulong + +let is_long_oct s int uint long ulong = + is_long_ho s int uint long ulong 1 3 + (* stupid, but probably more efficient than taking logs *) + (function 0 -> 3 | 1 -> 2 | n when n < 4 -> 1 | _ -> 0) +let is_long_hex s int uint long ulong = + is_long_ho s int uint long ulong 2 4 + (* stupid, but probably more efficient than taking logs *) + (function 0 -> 4 | 1 -> 3 | n when n < 4 -> 2 | n when n < 8 -> 1 + | _ -> 0) + +let sint = (Signed,CInt) +let uint = (UnSigned,CInt) +let slong = (Signed,CLong) +let ulong = (UnSigned,CLong) + } (*****************************************************************************) @@ -635,23 +686,36 @@ rule token = parse } - (* Take care of the order ? No because lex try the longest match. The + (* Take care of the order ? No because lex tries the longest match. The * strange diff between decimal and octal constant semantic is not * understood too by refman :) refman:11.1.4, and ritchie. - * - * todo: attach type info to constant, like for float *) - | (( decimal | hexa | octal) - ( ['u' 'U'] - | ['l' 'L'] - | (['l' 'L'] ['u' 'U']) - | (['u' 'U'] ['l' 'L']) - | (['u' 'U'] ['l' 'L'] ['l' 'L']) - | (['l' 'L'] ['l' 'L']) - )? - ) as x { TInt (x, tokinfo lexbuf) } - + | decimal as x + { TInt ((x, is_long_dec x sint slong slong ulong), tokinfo lexbuf) } + | hexa as x + { TInt ((x, is_long_hex x sint uint slong ulong), tokinfo lexbuf) } + | octal as x + { TInt ((x, is_long_oct x sint uint slong ulong), tokinfo lexbuf) } + | ((decimal as s) ['u' 'U']) as x + { TInt ((x, is_long_dec s uint uint ulong ulong), tokinfo lexbuf) } + | ((hexa as s) ['u' 'U']) as x + { TInt ((x, is_long_hex s uint uint ulong ulong), tokinfo lexbuf) } + | ((octal as s) ['u' 'U']) as x + { TInt ((x, is_long_oct s uint uint ulong ulong), tokinfo lexbuf) } + | (( decimal as s) ['l' 'L']) as x + { TInt ((x, is_long_dec s slong slong slong ulong), tokinfo lexbuf) } + | ((hexa as s) ['l' 'L']) as x + { TInt ((x, is_long_hex s slong slong slong ulong), tokinfo lexbuf) } + | ((octal as s) ['l' 'L']) as x + { TInt ((x, is_long_oct s slong slong slong ulong), tokinfo lexbuf) } + | ((( decimal | hexa | octal) ['l' 'L'] ['u' 'U']) + | (( decimal | hexa | octal) ['u' 'U'] ['l' 'L'])) as x + { TInt ((x, (UnSigned,CLong)), tokinfo lexbuf) } + | (( decimal | hexa | octal) ['l' 'L'] ['l' 'L']) as x + { TInt ((x, (Signed,CLongLong)), tokinfo lexbuf) } + | (( decimal | hexa | octal) ['u' 'U'] ['l' 'L'] ['l' 'L']) as x + { TInt ((x, (UnSigned,CLongLong)), tokinfo lexbuf) } | (real ['f' 'F']) as x { TFloat ((x, CFloat), tokinfo lexbuf) } | (real ['l' 'L']) as x { TFloat ((x, CLongDouble), tokinfo lexbuf) } @@ -769,6 +833,7 @@ and comment = parse (* noteopti: *) | [^ '*']+ { let s = tok lexbuf in s ^ comment lexbuf } | [ '*'] { let s = tok lexbuf in s ^ comment lexbuf } + | eof { pr2 "LEXER: end of file in comment"; "*/"} | _ { let s = tok lexbuf in pr2 ("LEXER: unrecognised symbol in comment:"^s); diff --git a/parsing_c/lexer_parser.ml b/parsing_c/lexer_parser.ml index c54b786..08624e8 100644 --- a/parsing_c/lexer_parser.ml +++ b/parsing_c/lexer_parser.ml @@ -34,6 +34,8 @@ open Common (* parse_typedef_fix *) let _handle_typedef = ref true +let _always_look_typedef = ref false + (* parse_typedef_fix2 *) let enable_typedef () = _handle_typedef := true let disable_typedef () = _handle_typedef := false @@ -54,7 +56,7 @@ type identkind = TypeDefI | IdentI let (_typedef : (string, identkind) Common.scoped_h_env ref) = ref (Common.empty_scoped_h_env ()) -let is_typedef s = if !_handle_typedef then +let is_typedef s = if !_handle_typedef || !_always_look_typedef then (match (Common.optionise (fun () -> Common.lookup_h_env s !_typedef)) with | Some TypeDefI -> true | Some IdentI -> false diff --git a/parsing_c/lib_parsing_c.ml b/parsing_c/lib_parsing_c.ml index 3b4357b..577ef14 100644 --- a/parsing_c/lib_parsing_c.ml +++ b/parsing_c/lib_parsing_c.ml @@ -13,6 +13,11 @@ *) open Common +(*****************************************************************************) +(* Wrappers *) +(*****************************************************************************) +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_parsing + (*****************************************************************************) (* Abstract line *) (*****************************************************************************) @@ -32,7 +37,7 @@ let strip_info_visitor _ = function i -> ctr := !ctr + 1; Ast_c.al_info_cpp !ctr i)); Visitor_c.kexpr_s = (fun (k,_) e -> - let (e', ty),ii' = k e in + let (e', ty), ii' = k e in (e', Ast_c.noType()(*ref !ty*)), ii' (* keep type - jll *) ); @@ -238,3 +243,26 @@ let names_of_parameters_in_macro xs = let (s, ii2) = xx in s ) + + + +(* only used in ast_to_flow, so move it ? *) +let rec stmt_elems_of_sequencable xs = + xs +> Common.map (fun x -> + match x with + | Ast_c.StmtElem e -> [e] + | Ast_c.CppDirectiveStmt _ + | Ast_c.IfdefStmt _ + -> + pr2_once ("stmt_elems_of_sequencable: filter a directive"); + [] + | Ast_c.IfdefStmt2 (_ifdef, xxs) -> + pr2 ("stmt_elems_of_sequencable: IfdefStm2 TODO?"); + xxs +> List.map (fun xs -> + let xs' = stmt_elems_of_sequencable xs in + xs' + ) +> List.flatten + ) +> List.flatten + + + diff --git a/parsing_c/parse_c.ml b/parsing_c/parse_c.ml index 6e0b505..20910aa 100644 --- a/parsing_c/parse_c.ml +++ b/parsing_c/parse_c.ml @@ -22,13 +22,7 @@ module Stat = Parsing_stat (*****************************************************************************) (* Wrappers *) (*****************************************************************************) -let pr2 s = - if !Flag_parsing_c.verbose_parsing - then Common.pr2 s - -let pr2_once s = - if !Flag_parsing_c.verbose_parsing - then Common.pr2_once s +let pr2_err, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_parsing (*****************************************************************************) (* Helpers *) @@ -45,7 +39,7 @@ let error_msg_tok tok = let file = TH.file_of_tok tok in if !Flag_parsing_c.verbose_parsing then Common.error_message file (token_to_strpos tok) - else ("error in " ^ file ^ "set verbose_parsing for more info") + else ("error in " ^ file ^ "; set verbose_parsing for more info") let print_bad line_error (start_line, end_line) filelines = @@ -204,7 +198,7 @@ let print_commentized xs = (* called by parse_print_error_heuristic *) let tokens2 file = - let table = Common.full_charpos_to_pos file in + let table = Common.full_charpos_to_pos_large file in Common.with_open_infile file (fun chan -> let lexbuf = Lexing.from_channel chan in @@ -217,9 +211,9 @@ let tokens2 file = (* could assert pinfo.filename = file ? *) match Ast_c.pinfo_of_info ii with Ast_c.OriginTok pi -> - Ast_c.OriginTok (Common.complete_parse_info file table pi) + Ast_c.OriginTok (Common.complete_parse_info_large file table pi) | Ast_c.ExpandedTok (pi,vpi) -> - Ast_c.ExpandedTok((Common.complete_parse_info file table pi),vpi) + Ast_c.ExpandedTok((Common.complete_parse_info_large file table pi),vpi) | Ast_c.FakeTok (s,vpi) -> Ast_c.FakeTok (s,vpi) | Ast_c.AbstractLineTok pi -> failwith "should not occur" }) @@ -329,7 +323,7 @@ let parse_gen parsefunc s = let lexer_function = (fun _ -> if TH.is_eof !cur_tok - then (pr2 "LEXER: ALREADY AT END"; !cur_tok) + then (pr2_err "LEXER: ALREADY AT END"; !cur_tok) else let v = Common.pop2 all_tokens in cur_tok := v; @@ -397,8 +391,8 @@ type class_token = | CReservedKwd (type | decl | qualif | flow | misc | attr) *) -let ident_to_typename ident = - (Ast_c.nQ, (Ast_c.TypeName (ident, Ast_c.noTypedefDef()), Ast_c.noii)) +let ident_to_typename ident : Ast_c.fullType = + Ast_c.mk_ty (Ast_c.TypeName (ident, Ast_c.noTypedefDef())) Ast_c.noii (* parse_typedef_fix4 *) @@ -446,7 +440,7 @@ let consistency_checking2 xs = let xs = Common.hash_to_list v in if List.length xs >= 2 then begin - pr2 ("CONFLICT:" ^ k); + pr2_err ("CONFLICT:" ^ k); let sorted = xs +> List.sort (fun (ka,va) (kb,vb) -> if !va =|= !vb then (match ka, kb with @@ -459,10 +453,10 @@ let consistency_checking2 xs = let sorted = List.rev sorted in match sorted with | [CTypedef, i1;CIdent, i2] -> - pr2 ("transforming some ident in typedef"); + pr2_err ("transforming some ident in typedef"); push2 k ident_to_type; | _ -> - pr2 ("TODO:other transforming?"); + pr2_err ("TODO:other transforming?"); end ); @@ -479,8 +473,8 @@ let consistency_checking2 xs = Visitor_c.kdefineval_s = (fun (k,bigf) x -> match x with | Ast_c.DefineExpr e -> - (match e with - | (Ast_c.Ident (ident), _), _ii -> + (match Ast_c.unwrap_expr e with + | Ast_c.Ident (ident) -> let s = Ast_c.str_of_name ident in if List.mem s !ident_to_type then @@ -492,20 +486,20 @@ let consistency_checking2 xs = | _ -> k x ); Visitor_c.kexpr_s = (fun (k, bigf) x -> - match x with + match Ast_c.get_e_and_ii x with | (Ast_c.SizeOfExpr e, tref), isizeof -> let i1 = tuple_of_list1 isizeof in - (match e with + (match Ast_c.get_e_and_ii e with | (Ast_c.ParenExpr e, _), iiparen -> - (match e with + let (i2, i3) = tuple_of_list2 iiparen in + (match Ast_c.get_e_and_ii e with | (Ast_c.Ident (ident), _), _ii -> let s = Ast_c.str_of_name ident in if List.mem s !ident_to_type then let t = ident_to_typename ident in - let (i2, i3) = tuple_of_list2 iiparen in - (Ast_c.SizeOfType t, tref), [i1;i2;i3] + (Ast_c.SizeOfType t, tref),[i1;i2;i3] else k x | _ -> k x ) @@ -528,6 +522,29 @@ let consistency_checking a = (* Error recovery *) (*****************************************************************************) +let is_define_passed passed = + let xs = passed +> List.rev +> List.filter TH.is_not_comment in + if List.length xs >= 2 + then + (match Common.head_middle_tail xs with + | Parser_c.TDefine _, _, Parser_c.TDefEOL _ -> + true + | _ -> false + ) + else begin + pr2_err "WEIRD: length list of error recovery tokens < 2 "; + false + end + +let is_defined_passed_bis last_round = + let xs = last_round +> List.filter TH.is_not_comment in + match xs with + | Parser_c.TDefine _::_ -> true + | _ -> false + +(* ---------------------------------------------------------------------- *) + + (* todo: do something if find Parser_c.Eof ? *) let rec find_next_synchro next already_passed = @@ -549,13 +566,7 @@ let rec find_next_synchro next already_passed = * first { I found, so quite sure we will not loop. *) let last_round = List.rev already_passed in - let is_define = - let xs = last_round +> List.filter TH.is_not_comment in - match xs with - | Parser_c.TDefine _::_ -> true - | _ -> false - in - if is_define + if is_defined_passed_bis last_round then find_next_synchro_define (last_round ++ next) [] else @@ -577,10 +588,10 @@ let rec find_next_synchro next already_passed = and find_next_synchro_define next already_passed = match next with | [] -> - pr2 "ERROR-RECOV: end of file while in recovery mode"; + pr2_err "ERROR-RECOV: end of file while in recovery mode"; already_passed, [] | (Parser_c.TDefEOL i as v)::xs -> - pr2 ("ERROR-RECOV: found sync end of #define, line "^i_to_s(TH.line_of_tok v)); + pr2_err ("ERROR-RECOV: found sync end of #define, line "^i_to_s(TH.line_of_tok v)); v::already_passed, xs | v::xs -> find_next_synchro_define xs (v::already_passed) @@ -591,28 +602,28 @@ and find_next_synchro_define next already_passed = and find_next_synchro_orig next already_passed = match next with | [] -> - pr2 "ERROR-RECOV: end of file while in recovery mode"; + pr2_err "ERROR-RECOV: end of file while in recovery mode"; already_passed, [] | (Parser_c.TCBrace i as v)::xs when TH.col_of_tok v =|= 0 -> - pr2 ("ERROR-RECOV: found sync '}' at line "^i_to_s (TH.line_of_tok v)); + pr2_err ("ERROR-RECOV: found sync '}' at line "^i_to_s (TH.line_of_tok v)); (match xs with | [] -> raise Impossible (* there is a EOF token normally *) (* still useful: now parser.mly allow empty ';' so normally no pb *) | Parser_c.TPtVirg iptvirg::xs -> - pr2 "ERROR-RECOV: found sync bis, eating } and ;"; + pr2_err "ERROR-RECOV: found sync bis, eating } and ;"; (Parser_c.TPtVirg iptvirg)::v::already_passed, xs | Parser_c.TIdent x::Parser_c.TPtVirg iptvirg::xs -> - pr2 "ERROR-RECOV: found sync bis, eating ident, }, and ;"; + pr2_err "ERROR-RECOV: found sync bis, eating ident, }, and ;"; (Parser_c.TPtVirg iptvirg)::(Parser_c.TIdent x)::v::already_passed, xs | Parser_c.TCommentSpace sp::Parser_c.TIdent x::Parser_c.TPtVirg iptvirg ::xs -> - pr2 "ERROR-RECOV: found sync bis, eating ident, }, and ;"; + pr2_err "ERROR-RECOV: found sync bis, eating ident, }, and ;"; (Parser_c.TCommentSpace sp):: (Parser_c.TPtVirg iptvirg):: (Parser_c.TIdent x):: @@ -622,7 +633,7 @@ and find_next_synchro_orig next already_passed = | Parser_c.TCommentNewline sp::Parser_c.TIdent x::Parser_c.TPtVirg iptvirg ::xs -> - pr2 "ERROR-RECOV: found sync bis, eating ident, }, and ;"; + pr2_err "ERROR-RECOV: found sync bis, eating ident, }, and ;"; (Parser_c.TCommentNewline sp):: (Parser_c.TPtVirg iptvirg):: (Parser_c.TIdent x):: @@ -634,13 +645,99 @@ and find_next_synchro_orig next already_passed = v::already_passed, xs ) | v::xs when TH.col_of_tok v =|= 0 && TH.is_start_of_something v -> - pr2 ("ERROR-RECOV: found sync col 0 at line "^ i_to_s(TH.line_of_tok v)); + pr2_err ("ERROR-RECOV: found sync col 0 at line "^ i_to_s(TH.line_of_tok v)); already_passed, v::xs | v::xs -> find_next_synchro_orig xs (v::already_passed) - + +(*****************************************************************************) +(* Macro problem recovery *) +(*****************************************************************************) +module TV = Token_views_c + +let candidate_macros_in_passed2 passed defs_optional = + let res = ref [] in + let res2 = ref [] in + + passed +> List.iter (function + | Parser_c.TIdent (s,_) + (* bugfix: may have to undo some infered things *) + | Parser_c.TMacroIterator (s,_) + | Parser_c.TypedefIdent (s,_) + -> + (match Common.hfind_option s defs_optional with + | Some def -> + if s ==~ Parsing_hacks.regexp_macro + then + (* pr2 (spf "candidate: %s" s); *) + Common.push2 (s, def) res + else + Common.push2 (s, def) res2 + | None -> () + ) + + | _ -> () + ); + if null !res + then !res2 + else !res + +let candidate_macros_in_passed a b = + Common.profile_code "MACRO managment" (fun () -> + candidate_macros_in_passed2 a b) + + + +let find_optional_macro_to_expand2 ~defs toks = + + let defs = Common.hash_of_list defs in + + let toks = toks +> Common.map (function + + (* special cases to undo *) + | Parser_c.TMacroIterator (s, ii) -> + if Hashtbl.mem defs s + then Parser_c.TIdent (s, ii) + else Parser_c.TMacroIterator (s, ii) + + | Parser_c.TypedefIdent (s, ii) -> + if Hashtbl.mem defs s + then Parser_c.TIdent (s, ii) + else Parser_c.TypedefIdent (s, ii) + + | x -> x + ) in + + let tokens = toks in + Parsing_hacks.fix_tokens_cpp ~macro_defs:defs tokens + + (* just calling apply_macro_defs and having a specialized version + * of the code in fix_tokens_cpp is not enough as some work such + * as the passing of the body of attribute in Parsing_hacks.find_macro_paren + * will not get the chance to be run on the new expanded tokens. + * Hence even if it's expensive, it's currently better to + * just call directly fix_tokens_cpp again here. + + let tokens2 = ref (tokens +> Common.acc_map TV.mk_token_extended) in + let cleaner = !tokens2 +> Parsing_hacks.filter_cpp_stuff in + let paren_grouped = TV.mk_parenthised cleaner in + Cpp_token_c.apply_macro_defs + ~msg_apply_known_macro:(fun s -> pr2 (spf "APPLYING: %s" s)) + ~msg_apply_known_macro_hint:(fun s -> pr2 "hint") + defs paren_grouped; + (* because the before field is used by apply_macro_defs *) + tokens2 := TV.rebuild_tokens_extented !tokens2; + Parsing_hacks.insert_virtual_positions + (!tokens2 +> Common.acc_map (fun x -> x.TV.tok)) + *) +let find_optional_macro_to_expand ~defs a = + Common.profile_code "MACRO managment" (fun () -> + find_optional_macro_to_expand2 ~defs a) + + + (*****************************************************************************) (* Include/Define hacks *) (*****************************************************************************) @@ -679,7 +776,9 @@ let new_info posadd str ii = let rec comment_until_defeol xs = match xs with - | [] -> failwith "cant find end of define token TDefEOL" + | [] -> + (* job not done in Cpp_token_c.define_parse ? *) + failwith "cant find end of define token TDefEOL" | x::xs -> (match x with | Parser_c.TDefEOL i -> @@ -716,22 +815,43 @@ let tokens_include (info, includes, filename, inifdef) = (*****************************************************************************) let parse_cpp_define_file2 file = - let toks = tokens ~profile:false file in - let toks = Parsing_hacks.fix_tokens_define toks in - Parsing_hacks.extract_cpp_define toks + Common.save_excursion Flag_parsing_c.verbose_lexing (fun () -> + Flag_parsing_c.verbose_lexing := false; + let toks = tokens ~profile:false file in + let toks = Cpp_token_c.fix_tokens_define toks in + Cpp_token_c.extract_cpp_define toks + ) let parse_cpp_define_file a = Common.profile_code_exclusif "HACK" (fun () -> parse_cpp_define_file2 a) + + +let (_defs : (string, Cpp_token_c.define_def) Hashtbl.t ref) = + ref (Hashtbl.create 101) + +let (_defs_builtins : (string, Cpp_token_c.define_def) Hashtbl.t ref) = + ref (Hashtbl.create 101) + + (* can not be put in parsing_hack, cos then mutually recursive problem as * we also want to parse the standard.h file. *) -let init_defs std_h = +let init_defs_macros std_h = if not (Common.lfile_exists std_h) then pr2 ("warning: Can't find default macro file: " ^ std_h) else begin pr2 ("init_defs: " ^ std_h); - Parsing_hacks._defs := Common.hash_of_list (parse_cpp_define_file std_h); + _defs := Common.hash_of_list (parse_cpp_define_file std_h); + end + +let init_defs_builtins file_h = + if not (Common.lfile_exists file_h) + then pr2 ("warning: Can't find macro file: " ^ file_h) + else begin + pr2 ("init_defs_builtins: " ^ file_h); + _defs_builtins := + Common.hash_of_list (parse_cpp_define_file file_h); end @@ -804,14 +924,26 @@ type tokens_state = { mutable passed : Parser_c.token list; mutable passed_clean : Parser_c.token list; } -let clone_tokens_stat tr = + +let mk_tokens_state toks = + { + rest = toks; + rest_clean = (toks +> List.filter TH.is_not_comment); + current = (List.hd toks); + passed = []; + passed_clean = []; + } + + + +let clone_tokens_state tr = { rest = tr.rest; rest_clean = tr.rest_clean; current = tr.current; passed = tr.passed; passed_clean = tr.passed_clean; } -let copy_tokens_stat ~src ~dst = +let copy_tokens_state ~src ~dst = dst.rest <- src.rest; dst.rest_clean <- src.rest_clean; dst.current <- src.current; @@ -819,6 +951,7 @@ let copy_tokens_stat ~src ~dst = dst.passed_clean <- src.passed_clean; () +(* todo? agglomerate the x##b ? *) let rec filter_noise n xs = match n, xs with | _, [] -> [] @@ -845,7 +978,7 @@ let clean_for_lookahead xs = *) let rec lexer_function ~pass tr = fun lexbuf -> match tr.rest with - | [] -> pr2 "ALREADY AT END"; tr.current + | [] -> pr2_err "ALREADY AT END"; tr.current | v::xs -> tr.rest <- xs; tr.current <- v; @@ -873,7 +1006,7 @@ let rec lexer_function ~pass tr = fun lexbuf -> *) | Parser_c.TDefine (tok) -> if not (LP.current_context () =*= LP.InTopLevel) && - (!Flag_parsing_c.cpp_directive_passing || (pass =|= 2)) + (!Flag_parsing_c.cpp_directive_passing || (pass >= 2)) then begin incr Stat.nDefinePassing; pr2_once ("CPP-DEFINE: inside function, I treat it as comment"); @@ -892,7 +1025,7 @@ let rec lexer_function ~pass tr = fun lexbuf -> | Parser_c.TInclude (includes, filename, inifdef, info) -> if not (LP.current_context () =*= LP.InTopLevel) && - (!Flag_parsing_c.cpp_directive_passing || (pass =|= 2)) + (!Flag_parsing_c.cpp_directive_passing || (pass >= 2)) then begin incr Stat.nIncludePassing; pr2_once ("CPP-INCLUDE: inside function, I treat it as comment"); @@ -945,11 +1078,13 @@ let rec lexer_function ~pass tr = fun lexbuf -> end +let max_pass = 4 + let get_one_elem ~pass tr (file, filelines) = if not (LP.is_enabled_typedef()) && !Flag_parsing_c.debug_typedef - then pr2 "TYPEDEF:_handle_typedef=false. Not normal if dont come from exn"; + then pr2_err "TYPEDEF:_handle_typedef=false. Not normal if dont come from exn"; (* normally have to do that only when come from an exception in which * case the dt() may not have been done @@ -971,25 +1106,14 @@ let get_one_elem ~pass tr (file, filelines) = Common.profile_code_exclusif "YACC" (fun () -> Left (Parser_c.celem (lexer_function ~pass tr) lexbuf_fake) ) - with e -> begin - if (pass =|= 1 && !Flag_parsing_c.disable_two_pass)|| (pass =|= 2) - then begin - (match e with - (* Lexical is not anymore launched I think *) - | Lexer_c.Lexical s -> - pr2 ("lexical error " ^s^ "\n =" ^ error_msg_tok tr.current) - | Parsing.Parse_error -> - pr2 ("parse error \n = " ^ error_msg_tok tr.current) - | Semantic_c.Semantic (s, i) -> - pr2 ("semantic error " ^s^ "\n ="^ error_msg_tok tr.current) - | e -> raise e - ) - end; + with e -> LP.restore_typedef_state(); (* must keep here, before the code that adjusts the tr fields *) let line_error = TH.line_of_tok tr.current in - + + let passed_before_error = tr.passed in + let current = tr.current in (* error recovery, go to next synchro point *) let (passed', rest') = find_next_synchro tr.rest tr.passed in @@ -1003,8 +1127,9 @@ let get_one_elem ~pass tr (file, filelines) = let info_of_bads = Common.map_eff_rev TH.info_of_tok tr.passed in - Right (info_of_bads, line_error, tr.passed) - end + Right (info_of_bads, line_error, + tr.passed, passed_before_error, + current, e) ) @@ -1032,21 +1157,34 @@ let parse_print_error_heuristic2 file = (* -------------------------------------------------- *) LP.lexer_reset_typedef(); Parsing_hacks.ifdef_paren_cnt := 0; + let toks_orig = tokens file in - let toks = Parsing_hacks.fix_tokens_define toks_orig in - let toks = Parsing_hacks.fix_tokens_cpp toks in - - let tr = { - rest = toks; - rest_clean = (toks +> List.filter TH.is_not_comment); - current = (List.hd toks); - passed = []; - passed_clean = []; - } in + let toks = Cpp_token_c.fix_tokens_define toks_orig in + let toks = Parsing_hacks.fix_tokens_cpp ~macro_defs:!_defs_builtins toks in + (* expand macros on demand trick, preparation phase *) + let macros = + Common.profile_code "MACRO mgmt prep 1" (fun () -> + let macros = Hashtbl.copy !_defs in + (* include also builtins as some macros may generate some builtins too + * like __decl_spec or __stdcall + *) + !_defs_builtins +> Hashtbl.iter (fun s def -> + Hashtbl.replace macros s def; + ); + macros + ) + in + Common.profile_code "MACRO mgmt prep 2" (fun () -> + let local_macros = parse_cpp_define_file file in + local_macros +> List.iter (fun (s, def) -> + Hashtbl.replace macros s def; + ); + ); + let tr = mk_tokens_state toks in let rec loop tr = @@ -1063,21 +1201,64 @@ let parse_print_error_heuristic2 file = let checkpoint = TH.line_of_tok tr.current in let checkpoint_file = TH.file_of_tok tr.current in - let tr_save = clone_tokens_stat tr in - (* call the parser *) let elem = - let pass1 = get_one_elem ~pass:1 tr (file, filelines) in + let pass1 = + Common.profile_code "Parsing: 1st pass" (fun () -> + get_one_elem ~pass:1 tr (file, filelines) + ) in match pass1 with | Left e -> Left e - | Right res -> - if !Flag_parsing_c.disable_two_pass - then Right res + | Right (info,line_err, passed, passed_before_error, cur, exn) -> + if !Flag_parsing_c.disable_multi_pass + then pass1 else begin - pr2 "parsing pass2: try again"; - copy_tokens_stat ~src:tr_save ~dst: tr; - let pass2 = get_one_elem ~pass:2 tr (file, filelines) in - pass2 + Common.profile_code "Parsing: multi pass" (fun () -> + + pr2_err "parsing pass2: try again"; + let toks = List.rev passed ++ tr.rest in + let new_tr = mk_tokens_state toks in + copy_tokens_state ~src:new_tr ~dst:tr; + let passx = get_one_elem ~pass:2 tr (file, filelines) in + + (match passx with + | Left e -> passx + | Right (info,line_err,passed,passed_before_error,cur,exn) -> + let candidates = + candidate_macros_in_passed passed macros + in + if is_define_passed passed || null candidates + then passx + else begin + (* todo factorize code *) + + pr2_err "parsing pass3: try again"; + let toks = List.rev passed ++ tr.rest in + let toks' = + find_optional_macro_to_expand ~defs:candidates toks in + let new_tr = mk_tokens_state toks' in + copy_tokens_state ~src:new_tr ~dst:tr; + let passx = get_one_elem ~pass:3 tr (file, filelines) in + + (match passx with + | Left e -> passx + | Right (info,line_err,passed,passed_before_error,cur,exn) -> + pr2_err "parsing pass4: try again"; + + let candidates = + candidate_macros_in_passed passed macros in + + let toks = List.rev passed ++ tr.rest in + let toks' = + find_optional_macro_to_expand ~defs:candidates toks in + let new_tr = mk_tokens_state toks' in + copy_tokens_state ~src:new_tr ~dst:tr; + let passx = get_one_elem ~pass:4 tr (file, filelines) in + passx + ) + end + ) + ) end in @@ -1086,37 +1267,6 @@ let parse_print_error_heuristic2 file = let checkpoint2 = TH.line_of_tok tr.current in (* <> line_error *) let checkpoint2_file = TH.file_of_tok tr.current in - let was_define = - (match elem with - | Left _ -> false - | Right (_, line_error, _) -> - let was_define = - let xs = tr.passed +> List.rev +> List.filter TH.is_not_comment in - if List.length xs >= 2 - then - (match Common.head_middle_tail xs with - | Parser_c.TDefine _, _, Parser_c.TDefEOL _ -> - true - | _ -> false - ) - else begin - pr2 "WEIRD: length list of error recovery tokens < 2 "; - false - end - in - (if was_define && !Flag_parsing_c.filter_msg_define_error - then () - else - (* bugfix: *) - if (checkpoint_file =$= checkpoint2_file) && - checkpoint_file =$= file - then print_bad line_error (checkpoint, checkpoint2) filelines - else pr2 "PB: bad: but on tokens not from original file" - ); - was_define - ) in - - let diffline = if (checkpoint_file =$= checkpoint2_file) && (checkpoint_file =$= file) then (checkpoint2 - checkpoint) @@ -1139,22 +1289,59 @@ let parse_print_error_heuristic2 file = | Left e -> stat.Stat.correct <- stat.Stat.correct + diffline; e - | Right (info_of_bads, line_error, toks_of_bads) -> + | Right (info_of_bads, line_error, toks_of_bads, + _passed_before_error, cur, exn) -> + + let was_define = is_define_passed tr.passed in + + if was_define && !Flag_parsing_c.filter_msg_define_error + then () + else begin + + (match exn with + | Lexer_c.Lexical _ + | Parsing.Parse_error + | Semantic_c.Semantic _ -> () + | e -> raise e + ); + + if !Flag_parsing_c.show_parsing_error + then begin + (match exn with + (* Lexical is not anymore launched I think *) + | Lexer_c.Lexical s -> + pr2 ("lexical error " ^s^ "\n =" ^ error_msg_tok cur) + | Parsing.Parse_error -> + pr2 ("parse error \n = " ^ error_msg_tok cur) + | Semantic_c.Semantic (s, i) -> + pr2 ("semantic error " ^s^ "\n ="^ error_msg_tok cur) + | e -> raise Impossible + ); + (* bugfix: *) + if (checkpoint_file =$= checkpoint2_file) && + checkpoint_file =$= file + then print_bad line_error (checkpoint, checkpoint2) filelines + else pr2 "PB: bad: but on tokens not from original file" + end; + + + let pbline = + toks_of_bads + +> Common.filter (TH.is_same_line_or_close line_error) + +> Common.filter TH.is_ident_like + in + let error_info = + (pbline +> List.map TH.str_of_tok), line_error + in + stat.Stat.problematic_lines <- + error_info::stat.Stat.problematic_lines; + + end; + if was_define && !Flag_parsing_c.filter_define_error then stat.Stat.correct <- stat.Stat.correct + diffline else stat.Stat.bad <- stat.Stat.bad + diffline; - let pbline = - toks_of_bads - +> Common.filter (TH.is_same_line_or_close line_error) - +> Common.filter TH.is_ident_like - in - let error_info = - (pbline +> List.map TH.str_of_tok), line_error - in - stat.Stat.problematic_lines <- - error_info::stat.Stat.problematic_lines; - Ast_c.NotParsedCorrectly info_of_bads in @@ -1215,8 +1402,9 @@ let parse_cache file = (*****************************************************************************) let (cstatement_of_string: string -> Ast_c.statement) = fun s -> - Common.write_file ("/tmp/__cocci.c") ("void main() { \n" ^ s ^ "\n}"); - let program = parse_c_and_cpp ("/tmp/__cocci.c") +> fst in + let tmpfile = Common.new_temp_file "cocci_stmt_of_s" "c" in + Common.write_file tmpfile ("void main() { \n" ^ s ^ "\n}"); + let program = parse_c_and_cpp tmpfile +> fst in program +> Common.find_some (fun (e,_) -> match e with | Ast_c.Definition ({Ast_c.f_body = [Ast_c.StmtElem st]},_) -> Some st @@ -1224,13 +1412,18 @@ let (cstatement_of_string: string -> Ast_c.statement) = fun s -> ) let (cexpression_of_string: string -> Ast_c.expression) = fun s -> - Common.write_file ("/tmp/__cocci.c") ("void main() { \n" ^ s ^ ";\n}"); - let program = parse_c_and_cpp ("/tmp/__cocci.c") +> fst in + let tmpfile = Common.new_temp_file "cocci_expr_of_s" "c" in + Common.write_file tmpfile ("void main() { \n" ^ s ^ ";\n}"); + let program = parse_c_and_cpp tmpfile +> fst in program +> Common.find_some (fun (e,_) -> match e with | Ast_c.Definition ({Ast_c.f_body = compound},_) -> (match compound with - | [Ast_c.StmtElem (Ast_c.ExprStatement (Some e),ii)] -> Some e + | [Ast_c.StmtElem st] -> + (match Ast_c.unwrap_st st with + | Ast_c.ExprStatement (Some e) -> Some e + | _ -> None + ) | _ -> None ) | _ -> None diff --git a/parsing_c/parse_c.mli b/parsing_c/parse_c.mli index 8a6cc91..c877e7d 100644 --- a/parsing_c/parse_c.mli +++ b/parsing_c/parse_c.mli @@ -12,6 +12,20 @@ type program2 = toplevel2 list (* the token list contains now also the comment-tokens *) and info_item = (string * Parser_c.token list) +(* ---------------------------------------------------------------------- *) +(* a few globals *) +val parse_cpp_define_file : + filename -> (string, Cpp_token_c.define_def) assoc + +(* usually correspond to what is inside your macros.h *) +val _defs : (string, Cpp_token_c.define_def) Hashtbl.t ref +(* usually correspond to what is inside your standard.h *) +val _defs_builtins : (string, Cpp_token_c.define_def) Hashtbl.t ref + +val init_defs_macros : filename -> unit +val init_defs_builtins : filename -> unit + + (* ---------------------------------------------------------------------- *) (* This is the main function *) val parse_print_error_heuristic: @@ -24,17 +38,6 @@ val parse_c_and_cpp : val parse_cache: filename (*cfile*) -> (program2 * Parsing_stat.parsing_stat) - -(* ---------------------------------------------------------------------- *) -val parse_cpp_define_file : - filename -> (string, Parsing_hacks.define_def) assoc - -val init_defs : filename -> unit - - - - - (* ---------------------------------------------------------------------- *) (* used also for the standard.h file *) val tokens: ?profile:bool -> filename -> Parser_c.token list diff --git a/parsing_c/parser_c.mly b/parsing_c/parser_c.mly index e01b51f..14d3f8c 100644 --- a/parsing_c/parser_c.mly +++ b/parsing_c/parser_c.mly @@ -31,10 +31,7 @@ let warning s v = then Common.warning ("PARSING: " ^ s) v else v - -let pr2 s = - if !Flag_parsing_c.verbose_parsing - then Common.pr2 s +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_parsing (*****************************************************************************) (* Parse helpers functions *) @@ -135,8 +132,7 @@ let (fixDeclSpecForDecl: decl -> (fullType * (storage wrap))) = function typeD = (ty,iit); inlineD = (inline,iinl); } -> - ( - ((qu, iiq), + let ty',iit' = (match ty with | (None,None,None) -> (* generate fake_info, otherwise type_annotater can crash in @@ -151,8 +147,10 @@ let (fixDeclSpecForDecl: decl -> (fullType * (storage wrap))) = function BaseType(IntType (Si (Signed, [Short,CShort; Long, CLong; LongLong, CLongLong] +> List.assoc x))), iit | (Some UnSigned, Some x, (None| Some (BaseType (IntType (Si (_,CInt))))))-> BaseType(IntType (Si (UnSigned, [Short,CShort; Long, CLong; LongLong, CLongLong] +> List.assoc x))), iit - | (Some sign, None, (Some (BaseType (IntType CChar)))) -> BaseType(IntType (Si (sign, CChar2))), iit - | (None, Some Long,(Some(BaseType(FloatType CDouble)))) -> BaseType (FloatType (CLongDouble)), iit + | (Some sign, None, (Some (BaseType (IntType CChar)))) -> + BaseType(IntType (Si (sign, CChar2))), iit + | (None, Some Long,(Some(BaseType(FloatType CDouble)))) -> + BaseType (FloatType (CLongDouble)), iit | (Some _,_, Some _) -> (*mine*) @@ -174,9 +172,13 @@ let (fixDeclSpecForDecl: decl -> (fullType * (storage wrap))) = function * {....} and never with a typedef cos now we parse short uint i * as short ident ident => parse error (cos after first short i * pass in dt() mode) *) - )) + + ) + in + ((qu, iiq), + (ty', iit')) ,((st, inline),iist++iinl) - ) + let fixDeclSpecForParam = function ({storageD = (st,iist)} as r) -> let ((qu,ty) as v,_st) = fixDeclSpecForDecl r in @@ -188,6 +190,16 @@ let fixDeclSpecForParam = function ({storageD = (st,iist)} as r) -> (Semantic ("storage class specified for parameter of function", fake_pi)) +let fixDeclSpecForMacro = function ({storageD = (st,iist)} as r) -> + let ((qu,ty) as v,_st) = fixDeclSpecForDecl r in + match st with + | NoSto -> v + | _ -> + raise + (Semantic ("storage class specified for macro type decl", + fake_pi)) + + let fixDeclSpecForFuncDef x = let (returnType,storage) = fixDeclSpecForDecl x in (match fst (unwrap storage) with @@ -207,25 +219,33 @@ let fixDeclSpecForFuncDef x = * argument (in the typedef) *) let (fixOldCDecl: fullType -> fullType) = fun ty -> - match snd ty with - | ((FunctionType (fullt, (params, (b, iib)))),iifunc) -> + match Ast_c.unwrap_typeC ty with + | FunctionType (fullt, (params, (b, iib))) -> (* stdC: If the prototype declaration declares a parameter for a * function that you are defining (it is part of a function * definition), then you must write a name within the declarator. * Otherwise, you can omit the name. *) (match params with - | [{p_namei = None; p_type = ((_qua, (BaseType Void,_)))},_] -> - ty + | [{p_namei = None; p_type = ty2},_] -> + (match Ast_c.unwrap_typeC ty2 with + | BaseType Void -> + ty + | _ -> + pr2 ("SEMANTIC:parameter name omitted, but I continue"); + ty + ) + | params -> (params +> List.iter (fun (param,_) -> match param with | {p_namei = None} -> (* if majuscule, then certainly macro-parameter *) - pr2 ("SEMANTIC:parameter name omitted, but I continue"); + pr2 ("SEMANTIC:parameter name omitted, but I continue"); | _ -> () )); - ty) + ty + ) (* todo? can we declare prototype in the decl or structdef, ... => length <> but good kan meme *) @@ -237,16 +257,25 @@ let (fixOldCDecl: fullType -> fullType) = fun ty -> let fixFunc (typ, compound, old_style_opt) = let (cp,iicp) = compound in - match typ with - | (name, - (nQ, (FunctionType (fullt, (params,bool)),iifunc)), - (st,iist), - attrs) - -> + let (name, ty, (st,iist), attrs) = typ in + + let (qu, tybis) = ty in + + match Ast_c.unwrap_typeC ty with + | FunctionType (fullt, (params,abool)) -> + let iifunc = Ast_c.get_ii_typeC_take_care tybis in + let iistart = Ast_c.fakeInfo () in - assert (nQ =*= nullQualif); + assert (qu =*= nullQualif); + (match params with - | [{p_namei= None; p_type =((_qua, (BaseType Void,_)))}, _] -> () + | [{p_namei= None; p_type = ty2}, _] -> + (match Ast_c.unwrap_typeC ty2 with + | BaseType Void -> () + | _ -> + (* failwith "internal errror: fixOldCDecl not good" *) + () + ) | params -> params +> List.iter (function | ({p_namei = Some s}, _) -> () @@ -281,7 +310,7 @@ let fixFunc (typ, compound, old_style_opt) = (* it must be nullQualif,cos parser construct only this*) {f_name = name; - f_type = (fullt, (params, bool)); + f_type = (fullt, (params, abool)); f_storage = st; f_body = cp; f_attr = attrs; @@ -308,11 +337,19 @@ let et s () = LP.enable_typedef () -let fix_add_params_ident = function - | ((s, (nQ, (FunctionType (fullt, (params, bool)),_)), st, _attrs)) -> +let fix_add_params_ident x = + let (s, ty, st, _attrs) = x in + match Ast_c.unwrap_typeC ty with + | FunctionType (fullt, (params, bool)) -> (match params with - | [{p_namei=None; p_type=((_qua, (BaseType Void,_)))}, _] -> () + | [{p_namei=None; p_type=ty2}, _] -> + (match Ast_c.unwrap_typeC ty2 with + | BaseType Void -> () + | _ -> + (* failwith "internal errror: fixOldCDecl not good" *) + () + ) | params -> params +> List.iter (function | ({p_namei= Some name}, _) -> @@ -330,7 +367,7 @@ let fix_add_params_ident = function (* shortcuts *) (*-------------------------------------------------------------------------- *) -let mk_e e ii = ((e, Ast_c.noType()), ii) +let mk_e e ii = Ast_c.mk_e e ii let mk_string_wrap (s,info) = (s, [info]) @@ -358,7 +395,7 @@ let mk_string_wrap (s,info) = (s, [info]) /*(* the normal tokens *)*/ /*(*-----------------------------------------*)*/ -%token TInt +%token <(string * (Ast_c.sign * Ast_c.base)) * Ast_c.info> TInt %token <(string * Ast_c.floatType) * Ast_c.info> TFloat %token <(string * Ast_c.isWchar) * Ast_c.info> TChar %token <(string * Ast_c.isWchar) * Ast_c.info> TString @@ -483,9 +520,12 @@ let mk_string_wrap (s,info) = (s, [info]) %token <(string * Ast_c.info)> TMacroString %token <(string * Ast_c.info)> TMacroDecl %token TMacroDeclConst -%token <(string * Ast_c.info)> TMacroStructDecl + %token <(string * Ast_c.info)> TMacroIterator -/*(* %token <(string * Ast_c.info)> TMacroTop *)*/ +/*(* +%token <(string * Ast_c.info)> TMacroTop +%token <(string * Ast_c.info)> TMacroStructDecl +*)*/ %token <(string * Ast_c.info)> TMacroAttrStorage @@ -604,9 +644,19 @@ identifier: * also cppext: gccext: ##args for variadic macro *) */ -ident_cpp: +identifier_cpp: | TIdent { RegularName (mk_string_wrap $1) } + | ident_extra_cpp { $1 } + +ident_cpp: + | TIdent + { RegularName (mk_string_wrap $1) } + | TypedefIdent + { RegularName (mk_string_wrap $1) } + | ident_extra_cpp { $1 } + +ident_extra_cpp: | TIdent TCppConcatOp identifier_cpp_list { CppConcatenatedName ( @@ -719,8 +769,10 @@ postfix_expr: { mk_e(Constructor ($2, List.rev $5)) ([$1;$3;$4;$7] ++ $6) } primary_expr: - | ident_cpp { mk_e(Ident ($1)) [] } - | TInt { mk_e(Constant (Int (fst $1))) [snd $1] } + | identifier_cpp { mk_e(Ident ($1)) [] } + | TInt + { let (str,(sign,base)) = fst $1 in + mk_e(Constant (Int (str,Si(sign,base)))) [snd $1] } | TFloat { mk_e(Constant (Float (fst $1))) [snd $1] } | TString { mk_e(Constant (String (fst $1))) [snd $1] } | TChar { mk_e(Constant (Char (fst $1))) [snd $1] } @@ -787,7 +839,9 @@ tcpar2: TCPar { et "tcpar2" (); $1 (*TODO? et ? sure ? c pas dt plutot ? *) } /*(* statement *)*/ /*(*************************************************************************)*/ -statement: +statement: statement2 { mk_st (fst $1) (snd $1) } + +statement2: | labeled { Labeled (fst $1), snd $1 } | compound { Compound (fst $1), snd $1 } | expr_statement { ExprStatement(fst $1), snd $1 } @@ -823,9 +877,11 @@ end_labeled: * and modifying below stat_or_decl_list *)*/ | ident_cpp TDotDot - { Label ($1, (ExprStatement None, [])), [$2] } - | Tcase const_expr TDotDot { Case ($2, (ExprStatement None, [])), [$1;$3] } - | Tdefault TDotDot { Default (ExprStatement None, []), [$1; $2] } + { Label ($1, (mk_st (ExprStatement None) Ast_c.noii)), [$2] } + | Tcase const_expr TDotDot + { Case ($2, (mk_st (ExprStatement None) Ast_c.noii)), [$1;$3] } + | Tdefault TDotDot + { Default (mk_st (ExprStatement None) Ast_c.noii), [$1; $2] } @@ -850,16 +906,16 @@ compound2: stat_or_decl_list: | stat_or_decl { [$1] } /*(* gccext: to avoid conflicts, cf end_labeled above *)*/ - | end_labeled { [StmtElem (Labeled (fst $1), snd $1)] } + | end_labeled { [StmtElem (mk_st (Labeled (fst $1)) (snd $1))] } /*(* old: conflicts | stat_or_decl_list stat_or_decl { $1 ++ [$2] } *)*/ | stat_or_decl stat_or_decl_list { $1 :: $2 } stat_or_decl: - | decl { StmtElem (Decl ($1 Ast_c.LocalDecl), []) } + | decl { StmtElem (mk_st (Decl ($1 Ast_c.LocalDecl)) Ast_c.noii) } | statement { StmtElem $1 } /*(* gccext: *)*/ - | function_definition { StmtElem (NestedFunc $1, []) } + | function_definition { StmtElem (mk_st (NestedFunc $1) Ast_c.noii) } /* (* cppext: *)*/ | cpp_directive @@ -877,7 +933,7 @@ expr_statement: selection: | Tif TOPar expr TCPar statement %prec SHIFTHERE - { If ($3, $5, (ExprStatement None, [])), [$1;$2;$4] } + { If ($3, $5, (mk_st (ExprStatement None) Ast_c.noii)), [$1;$2;$4] } | Tif TOPar expr TCPar statement Telse statement { If ($3, $5, $7), [$1;$2;$4;$6] } | Tswitch TOPar expr TCPar statement @@ -1036,28 +1092,32 @@ declarator: /*(* so must do int * const p; if the pointer is constant, not the pointee *)*/ pointer: - | TMul { fun x ->(nQ, (Pointer x, [$1]))} - | TMul type_qualif_list { fun x ->($2.qualifD, (Pointer x, [$1]))} - | TMul pointer { fun x ->(nQ, (Pointer ($2 x),[$1]))} - | TMul type_qualif_list pointer { fun x ->($2.qualifD, (Pointer ($3 x),[$1]))} + | TMul { fun x -> mk_ty (Pointer x) [$1] } + | TMul pointer { fun x -> mk_ty (Pointer ($2 x)) [$1] } + | TMul type_qualif_list + { fun x -> ($2.qualifD, mk_tybis (Pointer x) [$1])} + | TMul type_qualif_list pointer + { fun x -> ($2.qualifD, mk_tybis (Pointer ($3 x)) [$1]) } direct_d: - | ident_cpp + | identifier_cpp { ($1, fun x -> x) } | TOPar declarator TCPar /*(* forunparser: old: $2 *)*/ - { (fst $2, fun x -> (nQ, (ParenType ((snd $2) x), [$1;$3]))) } + { (fst $2, fun x -> mk_ty (ParenType ((snd $2) x)) [$1;$3]) } | direct_d tocro tccro - { (fst $1,fun x->(snd $1) (nQ,(Array (None,x), [$2;$3]))) } + { (fst $1,fun x->(snd $1) (mk_ty (Array (None,x)) [$2;$3])) } | direct_d tocro const_expr tccro - { (fst $1,fun x->(snd $1) (nQ,(Array (Some $3,x), [$2;$4])))} + { (fst $1,fun x->(snd $1) (mk_ty (Array (Some $3,x)) [$2;$4])) } | direct_d topar tcpar { (fst $1, fun x->(snd $1) - (nQ,(FunctionType (x,(([],(false, [])))),[$2;$3]))) + (mk_ty (FunctionType (x,(([],(false, []))))) [$2;$3])) } | direct_d topar parameter_type_list tcpar - { (fst $1,fun x->(snd $1) (nQ,(FunctionType (x, $3), [$2;$4]))) } + { (fst $1,fun x->(snd $1) + (mk_ty (FunctionType (x, $3)) [$2;$4])) + } /*(*----------------------------*)*/ @@ -1075,20 +1135,20 @@ abstract_declarator: direct_abstract_declarator: | TOPar abstract_declarator TCPar /*(* forunparser: old: $2 *)*/ - { (fun x -> (nQ, (ParenType ($2 x), [$1;$3]))) } + { fun x -> mk_ty (ParenType ($2 x)) [$1;$3] } | TOCro TCCro - { fun x -> (nQ, (Array (None, x), [$1;$2]))} + { fun x -> mk_ty (Array (None, x)) [$1;$2] } | TOCro const_expr TCCro - { fun x -> (nQ, (Array (Some $2, x), [$1;$3]))} + { fun x -> mk_ty (Array (Some $2, x)) [$1;$3] } | direct_abstract_declarator TOCro TCCro - { fun x ->$1 (nQ, (Array (None, x), [$2;$3])) } + { fun x -> $1 (mk_ty (Array (None, x)) [$2;$3]) } | direct_abstract_declarator TOCro const_expr TCCro - { fun x ->$1 (nQ, (Array (Some $3,x), [$2;$4])) } + { fun x -> $1 (mk_ty (Array (Some $3,x)) [$2;$4]) } | TOPar TCPar - { fun x -> (nQ, (FunctionType (x, ([], (false, []))), [$1;$2])) } + { fun x -> mk_ty (FunctionType (x, ([], (false, [])))) [$1;$2] } | topar parameter_type_list tcpar - { fun x -> (nQ, (FunctionType (x, $2), [$1;$3]))} + { fun x -> mk_ty (FunctionType (x, $2)) [$1;$3] } /*(* subtle: here must also use topar, not TOPar, otherwise if have for * instance (xxx ( * )(xxx)) cast, then the second xxx may still be a Tident * but we want to reduce topar, to set the InParameter so that @@ -1099,9 +1159,9 @@ direct_abstract_declarator: * "disable typedef cos special case ..." message. *)*/ | direct_abstract_declarator topar tcpar - { fun x ->$1 (nQ, (FunctionType (x, (([], (false, [])))),[$2;$3])) } + { fun x -> $1 (mk_ty (FunctionType (x, (([], (false, []))))) [$2;$3]) } | direct_abstract_declarator topar parameter_type_list tcpar - { fun x -> $1 (nQ, (FunctionType (x, $3), [$2;$4])) } + { fun x -> $1 (mk_ty (FunctionType (x, $3)) [$2;$4]) } /*(*-----------------------------------------------------------------------*)*/ /*(* Parameters (use decl_spec not type_spec just for 'register') *)*/ @@ -1141,6 +1201,7 @@ parameter_decl2: /*(*----------------------------*)*/ parameter_decl: parameter_decl2 { et "param" (); $1 } + | attributes parameter_decl2 { et "param" (); $2 } declaratorp: | declarator { LP.add_ident (str_of_name (fst $1)); $1 } @@ -1274,7 +1335,7 @@ storage_class_spec2: storage_class_spec: /*(* gccext: *)*/ | storage_class_spec2 { $1 } - | storage_class_spec2 attributes_storage { $1 (* TODO *) } + | storage_class_spec2 attribute_storage_list { $1 (* TODO *) } @@ -1413,15 +1474,20 @@ struct_or_union2: struct_decl2: - | field_declaration { DeclarationField $1, noii } - | TPtVirg { EmptyField, [$1] } - | TMacroStructDecl { MacroStructDeclTodo, [] } + | field_declaration { DeclarationField $1 } + | TPtVirg { EmptyField $1 } + + /*(* no conflict ? no need for a TMacroStruct ? apparently not as at struct + * the rule are slightly different. + *)*/ + | identifier TOPar argument_list TCPar TPtVirg + { MacroDeclField ((fst $1, $3), [snd $1;$2;$4;$5;fakeInfo()]) } /*(* cppext: *)*/ | cpp_directive - { CppDirectiveStruct $1, noii } + { CppDirectiveStruct $1 } | cpp_ifdef_directive/*(* struct_decl_list ... *)*/ - { IfdefStruct $1, noii } + { IfdefStruct $1 } field_declaration: @@ -1605,10 +1671,41 @@ cpp_directive: define_val: | expr { DefineExpr $1 } | statement { DefineStmt $1 } - | decl { DefineStmt (Decl ($1 Ast_c.NotLocalDecl), []) } + | decl { DefineStmt (mk_st (Decl ($1 Ast_c.NotLocalDecl)) Ast_c.noii) } + +/*(*old: + * | TypedefIdent { DefineType (nQ,(TypeName(fst $1,noTypedefDef()),[snd $1]))} + * get conflicts: + * | spec_qualif_list TMul + * { let (returnType, _) = fixDeclSpecForDecl $1 in DefineType returnType } + *) +*/ + | decl_spec + { let returnType = fixDeclSpecForMacro $1 in + DefineType returnType + } + | decl_spec abstract_declarator + { let returnType = fixDeclSpecForMacro $1 in + let typ = $2 returnType in + DefineType typ + } + +/* can be in conflict with decl_spec, maybe change fixDeclSpecForMacro + * to also allow storage ? + | storage_class_spec { DefineTodo } + | Tinline { DefineTodo } +*/ + + /*(* a few special cases *)*/ + | stat_or_decl stat_or_decl_list { DefineTodo } +/* + | statement statement { DefineTodo } + | decl function_definition { DefineTodo } +*/ + + + -/*(*old: | TypedefIdent { DefineType (nQ,(TypeName(fst $1,noTypedefDef()),[snd $1]))}*)*/ - | spec_qualif_list { DefineTodo } | function_definition { DefineFunction $1 } | TOBraceDefineInit initialize_list gcc_comma_opt_struct TCBrace comma_opt @@ -1624,21 +1721,11 @@ define_val: DefineDoWhileZero (($2,$5), [$1;$3;$4;$6]) } - /*(* a few special cases *)*/ - | stat_or_decl stat_or_decl_list { DefineTodo } -/* - | statement statement { DefineTodo } - | decl function_definition { DefineTodo } -*/ - | Tasm TOPar asmbody TCPar { DefineTodo } | Tasm Tvolatile TOPar asmbody TCPar { DefineTodo } - /*(* aliases macro *)*/ | TMacroAttr { DefineTodo } - | storage_class_spec { DefineTodo } - | Tinline { DefineTodo } | /*(* empty *)*/ { DefineEmpty } @@ -1688,7 +1775,10 @@ cpp_other: * at the top, only decl or function definition. *)*/ | identifier TOPar argument_list TCPar TPtVirg - { MacroTop (fst $1, $3, [snd $1;$2;$4;$5]) } + { + Declaration (MacroDecl ((fst $1, $3), [snd $1;$2;$4;$5;fakeInfo()])) + (* old: MacroTop (fst $1, $3, [snd $1;$2;$4;$5]) *) + } /*(* TCParEOL to fix the end-of-stream bug of ocamlyacc *)*/ | identifier TOPar argument_list TCParEOL @@ -1883,7 +1973,6 @@ attribute_storage_list: attributes: attribute_list { $1 } -attributes_storage: attribute_storage_list { $1 } /*(* gccext: which allow a trailing ',' in enum, as in perl *)*/ diff --git a/parsing_c/parsing_hacks.ml b/parsing_c/parsing_hacks.ml index 866463b..50d769a 100644 --- a/parsing_c/parsing_hacks.ml +++ b/parsing_c/parsing_hacks.ml @@ -15,23 +15,20 @@ open Common module TH = Token_helpers +module TV = Token_views_c module LP = Lexer_parser module Stat = Parsing_stat open Parser_c +open TV + (*****************************************************************************) (* Some debugging functions *) (*****************************************************************************) -let pr2 s = - if !Flag_parsing_c.verbose_parsing - then Common.pr2 s - -let pr2_once s = - if !Flag_parsing_c.verbose_parsing - then Common.pr2_once s +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_parsing let pr2_cpp s = if !Flag_parsing_c.debug_cpp @@ -220,6 +217,10 @@ let msg_ifdef_funheaders () = incr Stat.nIfdefFunheader; () +let msg_ifdef_cparen_else () = + incr Stat.nIfdefPassing; + pr2_cpp("found ifdef-cparen-else") + let msg_attribute s = incr Stat.nMacroAttribute; @@ -262,555 +263,12 @@ let not_annot s = not (s ==~ regexp_annot) -(* ------------------------------------------------------------------------- *) -(* cpp part 1 for standard.h *) -(* ------------------------------------------------------------------------- *) - -type define_def = string * define_param * define_body - and define_param = - | NoParam - | Params of string list - and define_body = - | DefineBody of Parser_c.token list - | DefineHint of parsinghack_hint - - and parsinghack_hint = - | HintIterator - | HintDeclarator - | HintMacroString - | HintMacroStatement - | HintAttribute - | HintMacroIdentBuilder - - -(* cf also data/test.h *) -let assoc_hint_string = [ - "YACFE_ITERATOR" , HintIterator; - "YACFE_DECLARATOR" , HintDeclarator; - "YACFE_STRING" , HintMacroString; - "YACFE_STATEMENT" , HintMacroStatement; - "YACFE_ATTRIBUTE" , HintAttribute; - "YACFE_IDENT_BUILDER" , HintMacroIdentBuilder; - - "MACROSTATEMENT" , HintMacroStatement; (* backward compatibility *) -] - - -let (parsinghack_hint_of_string: string -> parsinghack_hint option) = fun s -> - Common.assoc_option s assoc_hint_string - -let (is_parsinghack_hint: string -> bool) = fun s -> - parsinghack_hint_of_string s <> None - -let (token_from_parsinghack_hint: - (string * Ast_c.info) -> parsinghack_hint -> Parser_c.token) = - fun (s,ii) hint -> - match hint with - | HintIterator -> - Parser_c.TMacroIterator (s, ii) - | HintDeclarator -> - Parser_c.TMacroDecl (s, ii) - | HintMacroString -> - Parser_c.TMacroString (s, ii) - | HintMacroStatement -> - Parser_c.TMacroStmt (s, ii) - | HintAttribute -> - Parser_c.TMacroAttr (s, ii) - | HintMacroIdentBuilder -> - Parser_c.TMacroIdentBuilder (s, ii) - - - -let (_defs : (string, define_def) Hashtbl.t ref) = - ref (Hashtbl.create 101) - - -(* ------------------------------------------------------------------------- *) -(* fuzzy parsing, different "views" over the same program *) -(* ------------------------------------------------------------------------- *) - - -(* Normally I should not use ref/mutable in the token_extended type - * and I should have a set of functions taking a list of tokens and - * returning a list of tokens. The problem is that to make easier some - * functions, it is better to work on better representation, on "views" - * over this list of tokens. But then modifying those views and get - * back from those views to the original simple list of tokens is - * tedious. One way is to maintain next to the view a list of "actions" - * (I was using a hash storing the charpos of the token and associating - * the action) but it is tedious too. Simpler to use mutable/ref. We - * use the same idea that we use when working on the Ast_c. *) - -(* old: when I was using the list of "actions" next to the views, the hash - * indexed by the charpos, there could have been some problems: - * how my fake_pos interact with the way I tag and adjust token ? - * because I base my tagging on the position of the token ! so sometimes - * could tag another fakeInfo that should not be tagged ? - * fortunately I don't use anymore this technique. - *) - -(* update: quite close to the Place_c.Inxxx *) -type context = - InFunction | InEnum | InStruct | InInitializer | NoContext - -type token_extended = { - mutable tok: Parser_c.token; - mutable where: context; - - (* less: need also a after ? *) - mutable new_tokens_before : Parser_c.token list; - - (* line x col cache, more easily accessible, of the info in the token *) - line: int; - col : int; -} - -let set_as_comment cppkind x = - if TH.is_eof x.tok - then () (* otherwise parse_c will be lost if don't find a EOF token *) - else - x.tok <- TCommentCpp (cppkind, TH.info_of_tok x.tok) - -let mk_token_extended x = - let (line, col) = TH.linecol_of_tok x in - { tok = x; - line = line; col = col; - where = NoContext; - new_tokens_before = []; - } - - -(* x list list, because x list separated by ',' *) -type paren_grouped = - | Parenthised of paren_grouped list list * token_extended list - | PToken of token_extended - -type brace_grouped = - | Braceised of - brace_grouped list list * token_extended * token_extended option - | BToken of token_extended - -(* Far better data structure than doing hacks in the lexer or parser - * because in lexer we don't know to which ifdef a endif is related - * and so when we want to comment a ifdef, we don't know which endif - * we must also comment. Especially true for the #if 0 which sometimes - * have a #else part. - * - * x list list, because x list separated by #else or #elif - *) -type ifdef_grouped = - | Ifdef of ifdef_grouped list list * token_extended list - | Ifdefbool of bool * ifdef_grouped list list * token_extended list - | NotIfdefLine of token_extended list - - -type 'a line_grouped = - Line of 'a list - - -type body_function_grouped = - | BodyFunction of token_extended list - | NotBodyLine of token_extended list - - -(* ------------------------------------------------------------------------- *) -(* view builders *) -(* ------------------------------------------------------------------------- *) - -(* todo: synchro ! use more indentation - * if paren not closed and same indentation level, certainly because - * part of a mid-ifdef-expression. -*) -let rec mk_parenthised xs = - match xs with - | [] -> [] - | x::xs -> - (match x.tok with - | TOPar _ | TOParDefine _ -> - let body, extras, xs = mk_parameters [x] [] xs in - Parenthised (body,extras)::mk_parenthised xs - | _ -> - PToken x::mk_parenthised xs - ) - -(* return the body of the parenthised expression and the rest of the tokens *) -and mk_parameters extras acc_before_sep xs = - match xs with - | [] -> - (* maybe because of #ifdef which "opens" '(' in 2 branches *) - pr2 "PB: not found closing paren in fuzzy parsing"; - [List.rev acc_before_sep], List.rev extras, [] - | x::xs -> - (match x.tok with - (* synchro *) - | TOBrace _ when x.col =|= 0 -> - pr2 "PB: found synchro point } in paren"; - [List.rev acc_before_sep], List.rev (extras), (x::xs) - - | TCPar _ | TCParEOL _ -> - [List.rev acc_before_sep], List.rev (x::extras), xs - | TOPar _ | TOParDefine _ -> - let body, extrasnest, xs = mk_parameters [x] [] xs in - mk_parameters extras - (Parenthised (body,extrasnest)::acc_before_sep) - xs - | TComma _ -> - let body, extras, xs = mk_parameters (x::extras) [] xs in - (List.rev acc_before_sep)::body, extras, xs - | _ -> - mk_parameters extras (PToken x::acc_before_sep) xs - ) - - - - -let rec mk_braceised xs = - match xs with - | [] -> [] - | x::xs -> - (match x.tok with - | TOBrace _ -> - let body, endbrace, xs = mk_braceised_aux [] xs in - Braceised (body, x, endbrace)::mk_braceised xs - | TCBrace _ -> - pr2 "PB: found closing brace alone in fuzzy parsing"; - BToken x::mk_braceised xs - | _ -> - BToken x::mk_braceised xs - ) - -(* return the body of the parenthised expression and the rest of the tokens *) -and mk_braceised_aux acc xs = - match xs with - | [] -> - (* maybe because of #ifdef which "opens" '(' in 2 branches *) - pr2 "PB: not found closing brace in fuzzy parsing"; - [List.rev acc], None, [] - | x::xs -> - (match x.tok with - | TCBrace _ -> [List.rev acc], Some x, xs - | TOBrace _ -> - let body, endbrace, xs = mk_braceised_aux [] xs in - mk_braceised_aux (Braceised (body,x, endbrace)::acc) xs - | _ -> - mk_braceised_aux (BToken x::acc) xs - ) - - - - -let rec mk_ifdef xs = - match xs with - | [] -> [] - | x::xs -> - (match x.tok with - | TIfdef _ -> - let body, extra, xs = mk_ifdef_parameters [x] [] xs in - Ifdef (body, extra)::mk_ifdef xs - | TIfdefBool (b,_, _) -> - let body, extra, xs = mk_ifdef_parameters [x] [] xs in - - (* if not passing, then consider a #if 0 as an ordinary #ifdef *) - if !Flag_parsing_c.if0_passing - then Ifdefbool (b, body, extra)::mk_ifdef xs - else Ifdef(body, extra)::mk_ifdef xs - - | TIfdefMisc (b,_,_) | TIfdefVersion (b,_,_) -> - let body, extra, xs = mk_ifdef_parameters [x] [] xs in - Ifdefbool (b, body, extra)::mk_ifdef xs - - - | _ -> - (* todo? can have some Ifdef in the line ? *) - let line, xs = Common.span (fun y -> y.line =|= x.line) (x::xs) in - NotIfdefLine line::mk_ifdef xs - ) - -and mk_ifdef_parameters extras acc_before_sep xs = - match xs with - | [] -> - (* Note that mk_ifdef is assuming that CPP instruction are alone - * on their line. Because I do a span (fun x -> is_same_line ...) - * I might take with me a #endif if this one is mixed on a line - * with some "normal" tokens. - *) - pr2 "PB: not found closing ifdef in fuzzy parsing"; - [List.rev acc_before_sep], List.rev extras, [] - | x::xs -> - (match x.tok with - | TEndif _ -> - [List.rev acc_before_sep], List.rev (x::extras), xs - | TIfdef _ -> - let body, extrasnest, xs = mk_ifdef_parameters [x] [] xs in - mk_ifdef_parameters - extras (Ifdef (body, extrasnest)::acc_before_sep) xs - - | TIfdefBool (b,_,_) -> - let body, extrasnest, xs = mk_ifdef_parameters [x] [] xs in - - if !Flag_parsing_c.if0_passing - then - mk_ifdef_parameters - extras (Ifdefbool (b, body, extrasnest)::acc_before_sep) xs - else - mk_ifdef_parameters - extras (Ifdef (body, extrasnest)::acc_before_sep) xs - - - | TIfdefMisc (b,_,_) | TIfdefVersion (b,_,_) -> - let body, extrasnest, xs = mk_ifdef_parameters [x] [] xs in - mk_ifdef_parameters - extras (Ifdefbool (b, body, extrasnest)::acc_before_sep) xs - - | TIfdefelse _ - | TIfdefelif _ -> - let body, extras, xs = mk_ifdef_parameters (x::extras) [] xs in - (List.rev acc_before_sep)::body, extras, xs - | _ -> - let line, xs = Common.span (fun y -> y.line =|= x.line) (x::xs) in - mk_ifdef_parameters extras (NotIfdefLine line::acc_before_sep) xs - ) - -(* --------------------------------------- *) - -let line_of_paren = function - | PToken x -> x.line - | Parenthised (xxs, info_parens) -> - (match info_parens with - | [] -> raise Impossible - | x::xs -> x.line - ) - - -let rec span_line_paren line = function - | [] -> [],[] - | x::xs -> - (match x with - | PToken tok when TH.is_eof tok.tok -> - [], x::xs - | _ -> - if line_of_paren x =|= line - then - let (l1, l2) = span_line_paren line xs in - (x::l1, l2) - else ([], x::xs) - ) - - -let rec mk_line_parenthised xs = - match xs with - | [] -> [] - | x::xs -> - let line_no = line_of_paren x in - let line, xs = span_line_paren line_no xs in - Line (x::line)::mk_line_parenthised xs - - -(* --------------------------------------- *) -let rec mk_body_function_grouped xs = - match xs with - | [] -> [] - | x::xs -> - (match x with - | {tok = TOBrace _; col = 0} -> - let is_closing_brace = function - | {tok = TCBrace _; col = 0 } -> true - | _ -> false - in - let body, xs = Common.span (fun x -> not (is_closing_brace x)) xs in - (match xs with - | ({tok = TCBrace _; col = 0 })::xs -> - BodyFunction body::mk_body_function_grouped xs - | [] -> - pr2 "PB:not found closing brace in fuzzy parsing"; - [NotBodyLine body] - | _ -> raise Impossible - ) - - | _ -> - let line, xs = Common.span (fun y -> y.line =|= x.line) (x::xs) in - NotBodyLine line::mk_body_function_grouped xs - ) - - -(* ------------------------------------------------------------------------- *) -(* view iterators *) -(* ------------------------------------------------------------------------- *) - -let rec iter_token_paren f xs = - xs +> List.iter (function - | PToken tok -> f tok; - | Parenthised (xxs, info_parens) -> - info_parens +> List.iter f; - xxs +> List.iter (fun xs -> iter_token_paren f xs) - ) - -let rec iter_token_brace f xs = - xs +> List.iter (function - | BToken tok -> f tok; - | Braceised (xxs, tok1, tok2opt) -> - f tok1; do_option f tok2opt; - xxs +> List.iter (fun xs -> iter_token_brace f xs) - ) - -let rec iter_token_ifdef f xs = - xs +> List.iter (function - | NotIfdefLine xs -> xs +> List.iter f; - | Ifdefbool (_, xxs, info_ifdef) - | Ifdef (xxs, info_ifdef) -> - info_ifdef +> List.iter f; - xxs +> List.iter (iter_token_ifdef f) - ) - - - - -let tokens_of_paren xs = - let g = ref [] in - xs +> iter_token_paren (fun tok -> push2 tok g); - List.rev !g - - -let tokens_of_paren_ordered xs = - let g = ref [] in - - let rec aux_tokens_ordered = function - | PToken tok -> push2 tok g; - | Parenthised (xxs, info_parens) -> - let (opar, cpar, commas) = - match info_parens with - | opar::xs -> - (match List.rev xs with - | cpar::xs -> - opar, cpar, List.rev xs - | _ -> raise Impossible - ) - | _ -> raise Impossible - in - push2 opar g; - aux_args (xxs,commas); - push2 cpar g; - - and aux_args (xxs, commas) = - match xxs, commas with - | [], [] -> () - | [xs], [] -> xs +> List.iter aux_tokens_ordered - | xs::ys::xxs, comma::commas -> - xs +> List.iter aux_tokens_ordered; - push2 comma g; - aux_args (ys::xxs, commas) - | _ -> raise Impossible - - in - - xs +> List.iter aux_tokens_ordered; - List.rev !g - - - - -(* ------------------------------------------------------------------------- *) -(* set the context info in token *) -(* ------------------------------------------------------------------------- *) - - -let rec set_in_function_tag xs = - (* could try: ) { } but it can be the ) of a if or while, so - * better to base the heuristic on the position in column zero. - * Note that some struct or enum or init put also their { in first column - * but set_in_other will overwrite the previous InFunction tag. - *) - match xs with - | [] -> () - (* ) { and the closing } is in column zero, then certainly a function *) - | BToken ({tok = TCPar _ })::(Braceised (body, tok1, Some tok2))::xs - when tok1.col <> 0 && tok2.col =|= 0 -> - body +> List.iter (iter_token_brace (fun tok -> - tok.where <- InFunction - )); - set_in_function_tag xs - - | (BToken x)::xs -> set_in_function_tag xs - | (Braceised (body, tok1, Some tok2))::xs - when tok1.col =|= 0 && tok2.col =|= 0 -> - body +> List.iter (iter_token_brace (fun tok -> - tok.where <- InFunction - )); - set_in_function_tag xs - | Braceised (body, tok1, tok2)::xs -> - set_in_function_tag xs - - -let rec set_in_other xs = - match xs with - | [] -> () - (* enum x { } *) - | BToken ({tok = Tenum _})::BToken ({tok = TIdent _}) - ::Braceised(body, tok1, tok2)::xs - | BToken ({tok = Tenum _}) - ::Braceised(body, tok1, tok2)::xs - -> - body +> List.iter (iter_token_brace (fun tok -> - tok.where <- InEnum; - )); - set_in_other xs - - (* struct x { } *) - | BToken ({tok = Tstruct _})::BToken ({tok = TIdent _}) - ::Braceised(body, tok1, tok2)::xs -> - body +> List.iter (iter_token_brace (fun tok -> - tok.where <- InStruct; - )); - set_in_other xs - (* = { } *) - | BToken ({tok = TEq _}) - ::Braceised(body, tok1, tok2)::xs -> - body +> List.iter (iter_token_brace (fun tok -> - tok.where <- InInitializer; - )); - set_in_other xs - - | BToken _::xs -> set_in_other xs - - | Braceised(body, tok1, tok2)::xs -> - body +> List.iter set_in_other; - set_in_other xs - - - - -let set_context_tag xs = - begin - set_in_function_tag xs; - set_in_other xs; - end - (*****************************************************************************) (* Helpers *) (*****************************************************************************) -(* To expand the parameter of the macro. The env corresponds to the actual - * code that is binded to the parameters of the macro. - * TODO? recurse ? fixpoint ? the expansion may also contain macro. - * Or to macro expansion in a strict manner, that is process first - * the parameters, expands macro in params, and then process enclosing - * macro call. - *) -let rec (cpp_engine: (string , Parser_c.token list) assoc -> - Parser_c.token list -> Parser_c.token list) = - fun env xs -> - xs +> List.map (fun tok -> - match tok with - | TIdent (s,i1) when List.mem_assoc s env -> Common.assoc s env - | x -> [x] - ) - +> List.flatten - - - - (* ------------------------------------------------------------------------- *) (* the pair is the status of '()' and '{}', ex: (-1,0) * if too much ')' and good '{}' @@ -818,10 +276,10 @@ let rec (cpp_engine: (string , Parser_c.token list) assoc -> * could do for ',' if encounter ',' at "toplevel", not inside () or {} * then if have ifdef, then certainly can lead to a problem. *) -let (count_open_close_stuff_ifdef_clause: ifdef_grouped list -> (int * int)) = +let (count_open_close_stuff_ifdef_clause: TV.ifdef_grouped list -> (int * int))= fun xs -> let cnt_paren, cnt_brace = ref 0, ref 0 in - xs +> iter_token_ifdef (fun x -> + xs +> TV.iter_token_ifdef (fun x -> (match x.tok with | x when TH.is_opar x -> incr cnt_paren | TOBrace _ -> incr cnt_brace @@ -1121,171 +579,61 @@ let rec adjust_inifdef_include xs = -(* ------------------------------------------------------------------------- *) -(* cpp-builtin part2, macro, using standard.h or other defs *) -(* ------------------------------------------------------------------------- *) - -(* Thanks to this function many stuff are not anymore hardcoded in ocaml code - * (but they are now hardcoded in standard.h ...) - * - * - * - * No need to take care to not substitute the macro name itself - * that occurs in the macro definition because the macro name is - * after fix_token_define a TDefineIdent, no more a TIdent. - *) - -let rec apply_macro_defs xs = - match xs with - | [] -> () - (* old: "but could do more, could reuse same original token - * so that have in the Ast a Dbg, not a MACROSTATEMENT" - * - * | PToken ({tok = TIdent (s,i1)} as id)::xs - * when s = "MACROSTATEMENT" -> - * - * msg_macro_statement_hint s; - * id.tok <- TMacroStmt(TH.info_of_tok id.tok); - * find_macro_paren xs - * - * let msg_macro_statement_hint s = - * incr Stat.nMacroHint; - * () - * - *) - (* recognized macro of standard.h (or other) *) - | PToken ({tok = TIdent (s,i1)} as id)::Parenthised (xxs,info_parens)::xs - when Hashtbl.mem !_defs s -> - - msg_apply_known_macro s; - let (s, params, body) = Hashtbl.find !_defs s in - - (match params with - | NoParam -> - pr2 ("WEIRD: macro without param used before parenthize: " ^ s); - (* ex: PRINTP("NCR53C400 card%s detected\n" ANDP(((struct ... *) - - (match body with - | DefineBody bodymacro -> - set_as_comment (Token_c.CppMacro) id; - id.new_tokens_before <- bodymacro; - | DefineHint hint -> - msg_apply_known_macro_hint s; - id.tok <- token_from_parsinghack_hint (s,i1) hint; - ) - | Params params -> - (match body with - | DefineBody bodymacro -> - - (* bugfix: better to put this that before the match body, - * cos our macrostatement hint can have variable number of - * arguments and so it's ok if it does not match exactly - * the number of arguments. *) - if List.length params != List.length xxs - then begin - pr2_once ("WEIRD: macro with wrong number of arguments: " ^ s); - (* old: id.new_tokens_before <- bodymacro; *) - () - end - else - - let xxs' = xxs +> List.map (fun x -> - (tokens_of_paren_ordered x) +> List.map (fun x -> - TH.visitor_info_of_tok Ast_c.make_expanded x.tok - ) - ) in - id.new_tokens_before <- - cpp_engine (Common.zip params xxs') bodymacro; - - (* important to do that after have apply the macro, otherwise - * will pass as argument to the macro some tokens that - * are all TCommentCpp - *) - [Parenthised (xxs, info_parens)] +> - iter_token_paren (set_as_comment Token_c.CppMacro); - set_as_comment Token_c.CppMacro id; - - | DefineHint (HintMacroStatement as hint) -> - (* important to do that after have apply the macro, otherwise - * will pass as argument to the macro some tokens that - * are all TCommentCpp - * - * note: such macrostatement can have a variable number of - * arguments but here we don't care, we just pass all the - * parameters. - *) - - (match xs with - | PToken ({tok = TPtVirg _} as id2)::_ -> - pr2_once - ("macro stmt with trailing ';', passing also ';' for: "^ - s); - (* sometimes still want pass its params ... as in - * DEBUGPOLL(static unsigned int prev_mask = 0); - *) - - msg_apply_known_macro_hint s; - id.tok <- token_from_parsinghack_hint (s,i1) hint; - [Parenthised (xxs, info_parens)] +> - iter_token_paren (set_as_comment Token_c.CppMacro); - set_as_comment Token_c.CppMacro id2; - - | _ -> - msg_apply_known_macro_hint s; - id.tok <- token_from_parsinghack_hint (s,i1) hint; - [Parenthised (xxs, info_parens)] +> - iter_token_paren (set_as_comment Token_c.CppMacro); - ) - - - | DefineHint hint -> - msg_apply_known_macro_hint s; - id.tok <- token_from_parsinghack_hint (s,i1) hint; - ) - ); - apply_macro_defs xs - - | PToken ({tok = TIdent (s,i1)} as id)::xs - when Hashtbl.mem !_defs s -> - - msg_apply_known_macro s; - let (_s, params, body) = Hashtbl.find !_defs s in - - (match params with - | Params params -> - pr2 ("WEIRD: macro with params but no parens found: " ^ s); - (* dont apply the macro, perhaps a redefinition *) - () - | NoParam -> - (match body with - | DefineBody [newtok] -> - (* special case when 1-1 substitution, we reuse the token *) - id.tok <- (newtok +> TH.visitor_info_of_tok (fun _ -> - TH.info_of_tok id.tok)) - | DefineBody bodymacro -> - set_as_comment Token_c.CppMacro id; - id.new_tokens_before <- bodymacro; - | DefineHint hint -> - msg_apply_known_macro_hint s; - id.tok <- token_from_parsinghack_hint (s,i1) hint; - ) - ); - apply_macro_defs xs +let rec find_ifdef_cparen_else xs = + let rec aux xs = + xs +> List.iter (function + | NotIfdefLine _ -> () + | Ifdef (xxs, info_ifdef_stmt) -> + (match xxs with + | [] -> raise Impossible + | [first] -> () + | first::second::rest -> + (* found a closing ')' just after the #else *) - (* recurse *) - | (PToken x)::xs -> apply_macro_defs xs - | (Parenthised (xxs, info_parens))::xs -> - xxs +> List.iter apply_macro_defs; - apply_macro_defs xs + (* Too bad ocaml does not support better list pattern matching + * a la Prolog-III where can match the end of lists. + *) + let condition = + if List.length first = 0 then false + else + let last_line = Common.last first in + match last_line with + | NotIfdefLine xs -> + if List.length xs = 0 then false + else + let last_tok = Common.last xs in + TH.is_cpar last_tok.tok + | Ifdef _ | Ifdefbool _ -> false + in + if condition then begin + msg_ifdef_cparen_else(); + (* keep only first, treat the rest as comment *) + info_ifdef_stmt +> List.iter (set_as_comment Token_c.CppDirective); + (second::rest) +> List.iter + (iter_token_ifdef (set_as_comment Token_c.CppPassingCosWouldGetError)); + end + + ); + List.iter aux xxs + + (* no need complex analysis for ifdefbool *) + | Ifdefbool (_, xxs, info_ifdef_stmt) -> + List.iter aux xxs + ) + in aux xs +(* ------------------------------------------------------------------------- *) +(* cpp-builtin part2, macro, using standard.h or other defs *) +(* ------------------------------------------------------------------------- *) +(* now in cpp_token_c.ml *) (* ------------------------------------------------------------------------- *) (* stringification *) @@ -1338,24 +686,34 @@ let rec find_macro_paren xs = find_macro_paren xs (* - (* attribute cpp, __xxx id() *) + (* attribute cpp, __xxx id *) | PToken ({tok = TIdent (s,i1)} as id) - ::PToken ({tok = TIdent (s2, i2)}) - ::Parenthised(xxs,info_parens) + ::PToken ({tok = TIdent (s2, i2)} as id2) ::xs when s ==~ regexp_annot -> msg_attribute s; id.tok <- TMacroAttr (s, i1); - find_macro_paren (Parenthised(xxs,info_parens)::xs) + find_macro_paren ((PToken id2)::xs); (* recurse also on id2 ? *) - (* attribute cpp, id __xxx = *) - | PToken ({tok = TIdent (s,i1)}) - ::PToken ({tok = TIdent (s2, i2)} as id) - ::xs when s2 ==~ regexp_annot + (* attribute cpp, id __xxx *) + | PToken ({tok = TIdent (s,i1)} as _id) + ::PToken ({tok = TIdent (s2, i2)} as id2) + ::xs when s2 ==~ regexp_annot && (not (s ==~ regexp_typedef)) -> msg_attribute s2; - id.tok <- TMacroAttr (s2, i2); - find_macro_paren (xs) + id2.tok <- TMacroAttr (s2, i2); + find_macro_paren xs + + | PToken ({tok = (Tstatic _ | Textern _)} as tok1) + ::PToken ({tok = TIdent (s,i1)} as attr) + ::xs when s ==~ regexp_annot + -> + pr2_cpp ("storage attribute: " ^ s); + attr.tok <- TMacroAttrStorage (s,i1); + (* recurse, may have other storage attributes *) + find_macro_paren (PToken (tok1)::xs) + + *) (* storage attribute *) @@ -1366,7 +724,7 @@ let rec find_macro_paren xs = attr.tok <- TMacroAttrStorage (s,i1); (* recurse, may have other storage attributes *) find_macro_paren (PToken (tok1)::xs) - + (* stringification * @@ -1791,6 +1149,13 @@ let rec find_define_init_brace_paren xs = (* action *) (* ------------------------------------------------------------------------- *) +(* obsolete now with macro expansion ? get some regression if comment. + * todo: if do bad decision here, then it can influence other phases + * and make it hard to parse. So maybe when have a parse error, should + * undo some of the guess those heuristics have done, and restore + * the original token value. + *) + let rec find_actions = function | [] -> () @@ -1809,17 +1174,26 @@ let rec find_actions = function and find_actions_params xxs = xxs +> List.fold_left (fun acc xs -> let toks = tokens_of_paren xs in - if toks +> List.exists (fun x -> TH.is_statement x.tok) + if toks +> List.exists (fun x -> TH.is_statement x.tok) + (* undo: && List.length toks > 1 + * good for sparse, not good for linux + *) then begin xs +> iter_token_paren (fun x -> if TH.is_eof x.tok then (* certainly because paren detection had a pb because of - * some ifdef-exp + * some ifdef-exp. Do similar additional checking than + * what is done in set_as_comment. *) - pr2 "PB: weird, I try to tag an EOF token as action" + pr2 "PB: weird, I try to tag an EOF token as an action" else - x.tok <- TAction (TH.info_of_tok x.tok); + (* cf tests-bis/no_cpar_macro.c *) + if TH.is_eom x.tok + then + pr2 "PB: weird, I try to tag an EOM token as an action" + else + x.tok <- TAction (TH.info_of_tok x.tok); ); true (* modified *) end @@ -1832,15 +1206,6 @@ and find_actions_params xxs = (* main fix cpp function *) (* ------------------------------------------------------------------------- *) -let rebuild_tokens_extented toks_ext = - let _tokens = ref [] in - toks_ext +> List.iter (fun tok -> - tok.new_tokens_before +> List.iter (fun x -> push2 x _tokens); - push2 tok.tok _tokens - ); - let tokens = List.rev !_tokens in - (tokens +> acc_map mk_token_extended) - let filter_cpp_stuff xs = let rec aux xs = match xs with @@ -1863,8 +1228,8 @@ let filter_cpp_stuff xs = let insert_virtual_positions l = let strlen x = String.length (Ast_c.str_of_info x) in - let rec loop prev offset = function - [] -> [] + let rec loop prev offset acc = function + [] -> List.rev acc | x::xs -> let ii = TH.info_of_tok x in let inject pi = @@ -1872,28 +1237,30 @@ let insert_virtual_positions l = match Ast_c.pinfo_of_info ii with Ast_c.OriginTok pi -> let prev = Ast_c.parse_info_of_info ii in - x::(loop prev (strlen ii) xs) + loop prev (strlen ii) (x::acc) xs | Ast_c.ExpandedTok (pi,_) -> - inject (Ast_c.ExpandedTok (pi,(prev,offset))) :: - (loop prev (offset + (strlen ii)) xs) + let x' = inject (Ast_c.ExpandedTok (pi,(prev,offset))) in + loop prev (offset + (strlen ii)) (x'::acc) xs | Ast_c.FakeTok (s,_) -> - inject (Ast_c.FakeTok (s,(prev,offset))) :: - (loop prev (offset + (strlen ii)) xs) + let x' = inject (Ast_c.FakeTok (s,(prev,offset))) in + loop prev (offset + (strlen ii)) (x'::acc) xs | Ast_c.AbstractLineTok _ -> failwith "abstract not expected" in let rec skip_fake = function - [] -> [] + | [] -> [] | x::xs -> let ii = TH.info_of_tok x in match Ast_c.pinfo_of_info ii with - Ast_c.OriginTok pi -> + | Ast_c.OriginTok pi -> let prev = Ast_c.parse_info_of_info ii in - x::(loop prev (strlen ii) xs) + let res = loop prev (strlen ii) [] xs in + x::res | _ -> x::skip_fake xs in - skip_fake l + skip_fake l + (* ------------------------------------------------------------------------- *) -let fix_tokens_cpp2 tokens = - let tokens2 = ref (tokens +> acc_map mk_token_extended) in +let fix_tokens_cpp2 ~macro_defs tokens = + let tokens2 = ref (tokens +> Common.acc_map TV.mk_token_extended) in begin (* the order is important, if you put the action heuristic first, @@ -1916,22 +1283,29 @@ let fix_tokens_cpp2 tokens = * commentize_skip_start_to_end *) not (TH.is_comment x.tok) (* could filter also #define/#include *) ) in - let ifdef_grouped = mk_ifdef cleaner in + let ifdef_grouped = TV.mk_ifdef cleaner in set_ifdef_parenthize_info ifdef_grouped; find_ifdef_funheaders ifdef_grouped; find_ifdef_bool ifdef_grouped; find_ifdef_mid ifdef_grouped; + (* change order ? maybe cparen_else heuristic make some of the funheaders + * heuristics irrelevant ? + *) + find_ifdef_cparen_else ifdef_grouped; adjust_inifdef_include ifdef_grouped; (* macro 1 *) let cleaner = !tokens2 +> filter_cpp_stuff in - let paren_grouped = mk_parenthised cleaner in - apply_macro_defs paren_grouped; + let paren_grouped = TV.mk_parenthised cleaner in + Cpp_token_c.apply_macro_defs + ~msg_apply_known_macro + ~msg_apply_known_macro_hint + macro_defs paren_grouped; (* because the before field is used by apply_macro_defs *) - tokens2 := rebuild_tokens_extented !tokens2; + tokens2 := TV.rebuild_tokens_extented !tokens2; (* tagging contextual info (InFunc, InStruct, etc). Better to do * that after the "ifdef-simplification" phase. @@ -1940,7 +1314,7 @@ let fix_tokens_cpp2 tokens = not (TH.is_comment x.tok) (* could filter also #define/#include *) ) in - let brace_grouped = mk_braceised cleaner in + let brace_grouped = TV.mk_braceised cleaner in set_context_tag brace_grouped; @@ -1948,199 +1322,37 @@ let fix_tokens_cpp2 tokens = (* macro *) let cleaner = !tokens2 +> filter_cpp_stuff in - let paren_grouped = mk_parenthised cleaner in - let line_paren_grouped = mk_line_parenthised paren_grouped in + let paren_grouped = TV.mk_parenthised cleaner in + let line_paren_grouped = TV.mk_line_parenthised paren_grouped in find_define_init_brace_paren paren_grouped; find_string_macro_paren paren_grouped; find_macro_lineparen line_paren_grouped; find_macro_paren paren_grouped; - (* actions *) + (* obsolete: actions ? not yet *) let cleaner = !tokens2 +> filter_cpp_stuff in - let paren_grouped = mk_parenthised cleaner in + let paren_grouped = TV.mk_parenthised cleaner in find_actions paren_grouped; + - insert_virtual_positions (!tokens2 +> acc_map (fun x -> x.tok)) + insert_virtual_positions (!tokens2 +> Common.acc_map (fun x -> x.tok)) end -let time_hack1 a = - Common.profile_code_exclusif "HACK" (fun () -> fix_tokens_cpp2 a) - -let fix_tokens_cpp a = - Common.profile_code "C parsing.fix_cpp" (fun () -> time_hack1 a) - - - +let time_hack1 ~macro_defs a = + Common.profile_code_exclusif "HACK" (fun () -> fix_tokens_cpp2 ~macro_defs a) -(*****************************************************************************) -(* The #define tricks *) -(*****************************************************************************) +let fix_tokens_cpp ~macro_defs a = + Common.profile_code "C parsing.fix_cpp" (fun () -> time_hack1 ~macro_defs a) -(* ugly hack, a better solution perhaps would be to erase TDefEOL - * from the Ast and list of tokens in parse_c. - * - * note: I do a +1 somewhere, it's for the unparsing to correctly sync. - * - * note: can't replace mark_end_define by simply a fakeInfo(). The reason - * is where is the \n TCommentSpace. Normally there is always a last token - * to synchronize on, either EOF or the token of the next toplevel. - * In the case of the #define we got in list of token - * [TCommentSpace "\n"; TDefEOL] but if TDefEOL is a fakeinfo then we will - * not synchronize on it and so we will not print the "\n". - * A solution would be to put the TDefEOL before the "\n". - * - * todo?: could put a ExpandedTok for that ? - *) -let mark_end_define ii = - let ii' = - { Ast_c.pinfo = Ast_c.OriginTok { (Ast_c.parse_info_of_info ii) with - Common.str = ""; - Common.charpos = Ast_c.pos_of_info ii + 1 - }; - cocci_tag = ref Ast_c.emptyAnnot; - comments_tag = ref Ast_c.emptyComments; - } - in - TDefEOL (ii') -(* put the TDefEOL at the good place *) -let rec define_line_1 acc xs = - match xs with - | [] -> List.rev acc - | TDefine ii::xs -> - let line = Ast_c.line_of_info ii in - let acc = (TDefine ii) :: acc in - define_line_2 acc line ii xs - | TCppEscapedNewline ii::xs -> - pr2 "WEIRD: a \\ outside a #define"; - let acc = (TCommentSpace ii) :: acc in - define_line_1 acc xs - | x::xs -> define_line_1 (x::acc) xs - -and define_line_2 acc line lastinfo xs = - match xs with - | [] -> - (* should not happened, should meet EOF before *) - pr2 "PB: WEIRD"; - List.rev (mark_end_define lastinfo::acc) - | x::xs -> - let line' = TH.line_of_tok x in - let info = TH.info_of_tok x in - - (match x with - | EOF ii -> - let acc = (mark_end_define lastinfo) :: acc in - let acc = (EOF ii) :: acc in - define_line_1 acc xs - | TCppEscapedNewline ii -> - if (line' <> line) then pr2 "PB: WEIRD: not same line number"; - let acc = (TCommentSpace ii) :: acc in - define_line_2 acc (line+1) info xs - | x -> - if line' =|= line - then define_line_2 (x::acc) line info xs - else define_line_1 (mark_end_define lastinfo::acc) (x::xs) - ) - -let rec define_ident acc xs = - match xs with - | [] -> List.rev acc - | TDefine ii::xs -> - let acc = TDefine ii :: acc in - (match xs with - | TCommentSpace i1::TIdent (s,i2)::TOPar (i3)::xs -> - (* Change also the kind of TIdent to avoid bad interaction - * with other parsing_hack tricks. For instant if keep TIdent then - * the stringication algo can believe the TIdent is a string-macro. - * So simpler to change the kind of the ident too. - *) - (* if TOParDefine sticked to the ident, then - * it's a macro-function. Change token to avoid ambiguity - * between #define foo(x) and #define foo (x) - *) - let acc = (TCommentSpace i1) :: acc in - let acc = (TIdentDefine (s,i2)) :: acc in - let acc = (TOParDefine i3) :: acc in - define_ident acc xs - | TCommentSpace i1::TIdent (s,i2)::xs -> - let acc = (TCommentSpace i1) :: acc in - let acc = (TIdentDefine (s,i2)) :: acc in - define_ident acc xs - | _ -> - pr2 "WEIRD: weird #define body"; - define_ident acc xs - ) - | x::xs -> - let acc = x :: acc in - define_ident acc xs - - - -let fix_tokens_define2 xs = - define_ident [] (define_line_1 [] xs) - -let fix_tokens_define a = - Common.profile_code "C parsing.fix_define" (fun () -> fix_tokens_define2 a) - (*****************************************************************************) (* for the cpp-builtin, standard.h, part 0 *) (*****************************************************************************) -let macro_body_to_maybe_hint body = - match body with - | [] -> DefineBody body - | [TIdent (s,i1)] -> - (match parsinghack_hint_of_string s with - | Some hint -> DefineHint hint - | None -> DefineBody body - ) - | xs -> DefineBody body - - -let rec define_parse xs = - match xs with - | [] -> [] - | TDefine i1::TIdentDefine (s,i2)::TOParDefine i3::xs -> - let (tokparams, _, xs) = - xs +> Common.split_when (function TCPar _ -> true | _ -> false) in - let (body, _, xs) = - xs +> Common.split_when (function TDefEOL _ -> true | _ -> false) in - let params = - tokparams +> Common.map_filter (function - | TComma _ -> None - | TIdent (s, _) -> Some s - | x -> error_cant_have x - ) in - let body = body +> List.map - (TH.visitor_info_of_tok Ast_c.make_expanded) in - let def = (s, (s, Params params, macro_body_to_maybe_hint body)) in - def::define_parse xs - - | TDefine i1::TIdentDefine (s,i2)::xs -> - let (body, _, xs) = - xs +> Common.split_when (function TDefEOL _ -> true | _ -> false) in - let body = body +> List.map - (TH.visitor_info_of_tok Ast_c.make_expanded) in - let def = (s, (s, NoParam, macro_body_to_maybe_hint body)) in - def::define_parse xs - - | TDefine i1::_ -> - pr2_gen i1; - raise Impossible - | x::xs -> define_parse xs - - -let extract_cpp_define xs = - let cleaner = xs +> List.filter (fun x -> - not (TH.is_comment x) - ) in - define_parse cleaner - - - +(* now in cpp_token_c.ml *) (*****************************************************************************) (* Lexing with lookahead *) @@ -2389,8 +1601,7 @@ let lookahead2 ~pass next before = (take_safe 1 !passed_tok <> [Tenum])) && !LP._lexer_hint = Some LP.Toplevel -> - msg_typedef s; - LP.add_typedef_root s; + msg_typedef s; LP.add_typedef_root s; TypedefIdent s *) @@ -2531,8 +1742,7 @@ let lookahead2 ~pass next before = (* can have sizeof on expression | (Tsizeof::TOPar::TIdent s::TCPar::_, _) -> - msg_typedef s; - LP.add_typedef_root s; + msg_typedef s; LP.add_typedef_root s; Tsizeof *) @@ -2570,7 +1780,7 @@ let lookahead2 ~pass next before = *) (* not !LP._lexer_hint.toplevel *) if !Flag_parsing_c.ifdef_directive_passing - || (pass =|= 2) + || (pass >= 2) then begin if (LP.current_context () =*= LP.InInitializer) @@ -2578,7 +1788,7 @@ let lookahead2 ~pass next before = pr2_cpp "In Initializer passing"; (* cheat: dont count in stat *) incr Stat.nIfdefInitializer; end else begin - pr2_cpp("IFDEF: or related insde function. I treat it as comment"); + pr2_cpp("IFDEF: or related inside function. I treat it as comment"); incr Stat.nIfdefPassing; end; TCommentCpp (Token_c.CppDirective, ii) @@ -2587,7 +1797,7 @@ let lookahead2 ~pass next before = | (TUndef (id, ii) as x)::_, _ -> - if (pass =|= 2) + if (pass >= 2) then begin pr2_cpp("UNDEF: I treat it as comment"); TCommentCpp (Token_c.CppDirective, ii) @@ -2596,7 +1806,7 @@ let lookahead2 ~pass next before = | (TCppDirectiveOther (ii) as x)::_, _ -> - if (pass =|= 2) + if (pass >= 2) then begin pr2_cpp ("OTHER directive: I treat it as comment"); TCommentCpp (Token_c.CppDirective, ii) diff --git a/parsing_c/parsing_hacks.mli b/parsing_c/parsing_hacks.mli index 7b41698..4689fd0 100644 --- a/parsing_c/parsing_hacks.mli +++ b/parsing_c/parsing_hacks.mli @@ -6,8 +6,9 @@ open Common * sometimes we do some kind of lalr(k) by finding patterns. Often try to * work on better token representation, like ifdef-paren-ized, brace-ized, * paren-ized, so can do easier pattern matching to more easily match - * complex cpp idiom pattern. Also try to get context info such as - * whether the token is in a initializer as some common patterns have different + * complex cpp idiom pattern (cf token_views_c.ml). + * We also try to get more contextual information such as whether the + * token is in a initializer as some common patterns have different * use depending on context. * * @@ -27,49 +28,31 @@ open Common * * Cf the TMacroXxx in parser_c.mly and MacroXxx in ast_c.ml * - * Also try infer typedef. + * Also try to infer typedef. * * Also do other stuff involving cpp like expanding some macros, * or try parse well define body by finding the end of define virtual - * end-of-line token. + * end-of-line token. But now most of the code is actually in cpp_token_c.ml + * It is related to what is in the yacfe configuration file (e.g. standard.h) *) -(* corresponds to what is in the yacfe configuration file (e.g. standard.h) *) -type define_def = string * define_param * define_body - and define_param = - | NoParam - | Params of string list - and define_body = - | DefineBody of Parser_c.token list - | DefineHint of parsinghack_hint - - (* strongly corresponds to the TMacroXxx in the grammar and lexer and the - * MacroXxx in the ast. - *) - and parsinghack_hint = - | HintIterator - | HintDeclarator - | HintMacroString - | HintMacroStatement - | HintAttribute - | HintMacroIdentBuilder - val regexp_macro: Str.regexp val regexp_annot: Str.regexp val regexp_declare: Str.regexp val regexp_foreach: Str.regexp val regexp_typedef: Str.regexp -val _defs : (string, define_def) Hashtbl.t ref - -(* can reset it *) +(* can reset this global *) val ifdef_paren_cnt: int ref -val fix_tokens_define : Parser_c.token list -> Parser_c.token list -val extract_cpp_define : Parser_c.token list -> (string, define_def) assoc - +val filter_cpp_stuff : + Token_views_c.token_extended list -> Token_views_c.token_extended list +val insert_virtual_positions: + Parser_c.token list -> Parser_c.token list -val fix_tokens_cpp : Parser_c.token list -> Parser_c.token list +val fix_tokens_cpp : + macro_defs:(string, Cpp_token_c.define_def) Hashtbl.t -> + Parser_c.token list -> Parser_c.token list (* next stream tokens -> passed stream tokens -> final next token *) val lookahead : diff --git a/parsing_c/pretty_print_c.ml b/parsing_c/pretty_print_c.ml index f67d0f6..560240d 100644 --- a/parsing_c/pretty_print_c.ml +++ b/parsing_c/pretty_print_c.ml @@ -13,8 +13,15 @@ *) open Common + open Ast_c +(*****************************************************************************) +(* Wrappers *) +(*****************************************************************************) +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_unparsing + +(*****************************************************************************) type pr_elem_func = Ast_c.info -> unit type pr_space_func = unit -> unit @@ -67,8 +74,8 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = let start_block () = pr_nl(); pr_indent() in let end_block () = pr_unindent(); pr_nl() in - let indent_if_needed (s,_) f = - match s with + let indent_if_needed st f = + match Ast_c.unwrap_st st with Compound _ -> pr_space(); f() | _ -> (*no newline at the end - someone else will do that*) @@ -196,7 +203,8 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = pr_elem icp (* ---------------------- *) - and pp_statement = function + and pp_statement = fun st -> + match Ast_c.get_st_and_ii st with | Labeled (Label (name, st)), ii -> let (i2) = Common.tuple_of_list1 ii in pr_outdent(); pp_name name; pr_elem i2; pr_nl(); pp_statement st @@ -226,10 +234,10 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = | Selection (If (e, st1, st2)), i1::i2::i3::is -> pr_elem i1; pr_space(); pr_elem i2; pp_expression e; pr_elem i3; indent_if_needed st1 (function _ -> pp_statement st1); - (match (st2, is) with + (match (Ast_c.get_st_and_ii st2, is) with | ((ExprStatement None, []), []) -> () | ((ExprStatement None, []), [iifakend]) -> pr_elem iifakend - | st2, [i4;iifakend] -> pr_elem i4; + | _st2, [i4;iifakend] -> pr_elem i4; indent_if_needed st2 (function _ -> pp_statement st2); pr_elem iifakend | x -> raise Impossible @@ -253,10 +261,10 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = pr_elem i1; pr_space(); pr_elem i2; - pp_statement (ExprStatement e1opt, il1); - pp_statement (ExprStatement e2opt, il2); + pp_statement (Ast_c.mk_st (ExprStatement e1opt) il1); + pp_statement (Ast_c.mk_st (ExprStatement e2opt) il2); assert (null il3); - pp_statement (ExprStatement e3opt, il3); + pp_statement (Ast_c.mk_st (ExprStatement e3opt) il3); pr_elem i3; indent_if_needed st (function _ -> pp_statement st); pr_elem iifakend @@ -376,12 +384,12 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = (string * info) option -> (storage * il) option -> fullType -> attribute list -> unit) = - fun ident sto ((qu, iiqu), (ty, iity)) attrs -> - pp_base_type ((qu, iiqu), (ty, iity)) sto; - (match (ident,ty) with + fun ident sto ft attrs -> + pp_base_type ft sto; + (match (ident, Ast_c.unwrap_typeC ft) with (Some _,_) | (_,Pointer _) -> pr_space() | _ -> ()); - pp_type_with_ident_rest ident ((qu, iiqu), (ty, iity)) attrs + pp_type_with_ident_rest ident ft attrs and (pp_base_type: fullType -> (storage * il) option -> unit) = @@ -432,9 +440,9 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = ); fields +> List.iter - (fun (xfield, iipttvirg_when_emptyfield) -> + (fun (field) -> - match xfield with + match field with | DeclarationField(FieldDeclList(onefield_multivars,iiptvirg))-> (match onefield_multivars with | x::xs -> @@ -448,7 +456,7 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = let identinfo = match nameopt with | None -> None - | Some name -> Some (get_s_and_ii_of_name name) + | Some name -> Some (get_s_and_info_of_name name) in pp_type_with_ident identinfo None typ Ast_c.noattr; @@ -459,7 +467,7 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = | None -> pp_type typ; | Some name -> - let (s, is) = get_s_and_ii_of_name name in + let (s, is) = get_s_and_info_of_name name in pp_type_with_ident (Some (s, is)) None typ Ast_c.noattr; ); @@ -468,14 +476,14 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = ); (* match x, first onefield_multivars *) - (* for other vars *) + (* for other vars *) xs +> List.iter (function | (Simple (nameopt, typ)), iivirg -> iivirg +> List.iter pr_elem; let identinfo = match nameopt with | None -> None - | Some name -> Some (get_s_and_ii_of_name name) + | Some name -> Some (get_s_and_info_of_name name) in pp_type_with_ident_rest identinfo typ Ast_c.noattr @@ -483,7 +491,7 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = iivirg +> List.iter pr_elem; (match nameopt with | Some name -> - let (s,is) = get_s_and_ii_of_name name in + let (s,is) = get_s_and_info_of_name name in pp_type_with_ident_rest (Some (s, is)) typ Ast_c.noattr; pr_elem iidot; @@ -497,10 +505,28 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = iiptvirg +> List.iter pr_elem; - | MacroStructDeclTodo -> pr2 "MacroTodo" + | MacroDeclField ((s, es), ii) -> + let (iis, lp, rp, iiend, ifakestart) = + Common.tuple_of_list5 ii in + (* iis::lp::rp::iiend::ifakestart::iisto + iisto +> List.iter pr_elem; (* static and const *) + *) + pr_elem ifakestart; + pr_elem iis; + pr_elem lp; + es +> List.iter (fun (e, opt) -> + assert (List.length opt <= 1); + opt +> List.iter pr_elem; + pp_argument e; + ); + + pr_elem rp; + pr_elem iiend; + - | EmptyField -> iipttvirg_when_emptyfield +> List.iter pr_elem + | EmptyField iipttvirg_when_emptyfield -> + pr_elem iipttvirg_when_emptyfield | CppDirectiveStruct cpp -> pp_directive cpp | IfdefStruct ifdef -> pp_ifdef ifdef @@ -558,10 +584,19 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = assert (List.length iis =|= 2); print_sto_qu_ty (sto, qu, iis); - | (TypeName (name,_typ), noii) -> + | (TypeName (name,typ), noii) -> assert (null noii); - let (_s, iis) = get_s_and_ii_of_name name in + let (_s, iis) = get_s_and_info_of_name name in print_sto_qu_ty (sto, qu, [iis]); + + if !Flag_parsing_c.pretty_print_typedef_value + then begin + pr_elem (Ast_c.fakeInfo() +> Ast_c.rewrap_str "{*"); + typ +> Common.do_option (fun typ -> + pp_type typ; + ); + pr_elem (Ast_c.fakeInfo() +> Ast_c.rewrap_str "*}"); + end; | (TypeOfExpr (e), iis) -> print_sto_qu (sto, qu); @@ -597,6 +632,7 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = fullType -> attribute list -> unit) = fun ident (((qu, iiqu), (ty, iity)) as fullt) attrs -> + let print_ident ident = Common.do_option (fun (s, iis) -> (* XXX attrs +> pp_attributes pr_elem pr_space; *) pr_elem iis @@ -626,37 +662,51 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = pp_type_with_ident_rest ident t attrs; (* ugly special case ... todo? maybe sufficient in practice *) - | (ParenType (q1, (Pointer (q2, (FunctionType t, ii3)) , - [ipointer]) ), [i1;i2]) -> - pp_type_left (q2, (FunctionType t, ii3)); - pr_elem i1; - pr_elem ipointer; - print_ident ident; - pr_elem i2; - pp_type_right (q2, (FunctionType t, ii3)); - - (* another ugly special case *) - | (ParenType - (q1, (Array (eopt, - (q2, (Pointer - (q3, (FunctionType t, iifunc)), - [ipointer]))), - [iarray1;iarray2])), [i1;i2]) -> - pp_type_left (q3, (FunctionType t, iifunc)); - pr_elem i1; - pr_elem ipointer; - print_ident ident; - pr_elem iarray1; - do_option pp_expression eopt; - pr_elem iarray2; - pr_elem i2; - pp_type_right (q3, (FunctionType t, iifunc)) - - - - | (ParenType t, [i1;i2]) -> - pr2 "PB PARENTYPE ZARB, I forget about the ()"; - pp_type_with_ident_rest ident t attrs; + | (ParenType ttop, [i1;i2]) -> + (match Ast_c.get_ty_and_ii ttop with + | (_q1, (Pointer t2, [ipointer])) -> + (match Ast_c.get_ty_and_ii t2 with + | (q2, (FunctionType t, ii3)) -> + + pp_type_left (q2, mk_tybis (FunctionType t) ii3); + pr_elem i1; + pr_elem ipointer; + print_ident ident; + pr_elem i2; + pp_type_right (q2, mk_tybis (FunctionType t) ii3); + | _ -> + pr2 "PB PARENTYPE ZARB, I forget about the ()"; + pp_type_with_ident_rest ident ttop attrs; + ) + (* another ugly special case *) + | _q1, (Array (eopt,t2 ), [iarray1;iarray2]) -> + (match Ast_c.get_ty_and_ii t2 with + | (_q2, (Pointer t3, [ipointer])) -> + (match Ast_c.get_ty_and_ii t3 with + | (q3, (FunctionType t, iifunc)) -> + + pp_type_left (q3, mk_tybis (FunctionType t) iifunc); + pr_elem i1; + pr_elem ipointer; + print_ident ident; + pr_elem iarray1; + do_option pp_expression eopt; + pr_elem iarray2; + pr_elem i2; + pp_type_right (q3, mk_tybis (FunctionType t) iifunc) + | _ -> + pr2 "PB PARENTYPE ZARB, I forget about the ()"; + pp_type_with_ident_rest ident ttop attrs; + ) + | _ -> + pr2 "PB PARENTYPE ZARB, I forget about the ()"; + pp_type_with_ident_rest ident ttop attrs; + ) + | _t -> + + pr2 "PB PARENTYPE ZARB, I forget about the ()"; + pp_type_with_ident_rest ident ttop attrs; + ) | (Array (eopt, t), [i1;i2]) -> @@ -719,7 +769,7 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = | None -> pp_type t | Some name -> - let (s,i1) = get_s_and_ii_of_name name in + let (s,i1) = get_s_and_info_of_name name in pp_type_with_ident (Some (s, i1)) None t Ast_c.noattr @@ -783,7 +833,7 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = (* handling the first var. Special case, we print the whole type *) (match var with | Some (name, iniopt) -> - let (s,iis) = get_s_and_ii_of_name name in + let (s,iis) = get_s_and_info_of_name name in pp_type_with_ident (Some (s, iis)) (Some (storage, iisto)) returnType attrs; @@ -801,7 +851,7 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent = v_attr = attrs; }, iivirg) -> - let (s,iis) = get_s_and_ii_of_name name in + let (s,iis) = get_s_and_info_of_name name in assert (storage2 =*= storage); iivirg +> List.iter pr_elem; pp_type_with_ident_rest @@ -1083,7 +1133,7 @@ and pp_init (init, iinit) = pr2 "Decl" | F.ExprStatement (st, (eopt, ii)) -> - pp_statement (ExprStatement eopt, ii) + pp_statement (Ast_c.mk_st (ExprStatement eopt) ii) | F.IfHeader (_, (e,ii)) | F.SwitchHeader (_, (e,ii)) @@ -1308,6 +1358,11 @@ let string_of_expression e = Common.format_to_string (fun () -> pp_expression_simple e ) + +let string_of_toplevel top = + Common.format_to_string (fun () -> + pp_toplevel_simple top + ) let (debug_info_of_node: Ograph_extended.nodei -> Control_flow_c.cflow -> string) = diff --git a/parsing_c/pretty_print_c.mli b/parsing_c/pretty_print_c.mli index 9e8e475..d6273a8 100644 --- a/parsing_c/pretty_print_c.mli +++ b/parsing_c/pretty_print_c.mli @@ -62,3 +62,4 @@ val pp_flow_simple: flow_printer val debug_info_of_node: Ograph_extended.nodei -> Control_flow_c.cflow -> string val string_of_expression: Ast_c.expression -> string +val string_of_toplevel: Ast_c.toplevel -> string diff --git a/parsing_c/test_parsing_c.ml b/parsing_c/test_parsing_c.ml index 96cc546..e11d5df 100644 --- a/parsing_c/test_parsing_c.ml +++ b/parsing_c/test_parsing_c.ml @@ -6,6 +6,7 @@ let score_path = "/home/pad/c-yacfe/tmp" let tmpfile = "/tmp/output.c" +module Ast_to_flow = Control_flow_c_build (*****************************************************************************) (* Subsystem testing *) @@ -72,12 +73,6 @@ let test_parse_gen xs ext = else Hashtbl.add newscore file (Common.Pb s) ); - if not (null !stat_list) - then begin - Parsing_stat.print_recurring_problematic_tokens !stat_list; - Parsing_stat.print_parsing_stat_list !stat_list; - end; - dirname_opt +> Common.do_option (fun dirname -> pr2_xxxxxxxxxxxxxxxxx(); pr2 "regression testing information"; @@ -88,7 +83,14 @@ let test_parse_gen xs ext = Common.regression_testing newscore (Filename.concat score_path ("score_parsing__" ^str ^ def ^ ext ^ ".marshalled")) - ) + ); + + if not (null !stat_list) + then begin + Parsing_stat.print_recurring_problematic_tokens !stat_list; + Parsing_stat.print_parsing_stat_list !stat_list; + end; + () let test_parse_c xs = @@ -99,7 +101,61 @@ let test_parse_ch xs = test_parse_gen xs "[ch]" +(* ---------------------------------------------------------------------- *) + +let test_parse xs = + + Flag_parsing_c.filter_msg_define_error := true; + Flag_parsing_c.filter_define_error := true; + Flag_parsing_c.verbose_lexing := false; + Flag_parsing_c.verbose_parsing := false; + + let dirname_opt = + match xs with + | [x] when is_directory x -> Some x + | _ -> None + in + dirname_opt +> Common.do_option (fun dir -> + + let ext = "h" in + let fullxs = Common.files_of_dir_or_files_no_vcs ext [dir] in + fullxs +> List.iter (fun file -> + let xs = Parse_c.parse_cpp_define_file file in + xs +> List.iter (fun (x, def) -> + let (s, params, body) = def in + Hashtbl.replace !Parse_c._defs s (s, params, body); + ); + ); + ); + + let ext = "[ch]" in + + let fullxs = Common.files_of_dir_or_files_no_vcs ext xs in + + let stat_list = ref [] in + Common.check_stack_nbfiles (List.length fullxs); + + fullxs +> List.iter (fun file -> + if not (file =~ (".*\\."^ext)) + then pr2 ("warning: seems not a ."^ext^" file"); + pr2 ""; + pr2 ("PARSING: " ^ file); + + let (xs, stat) = Parse_c.parse_print_error_heuristic file in + xs +> List.iter (fun (ast, (s, toks)) -> + Parse_c.print_commentized toks + ); + + Common.push2 stat stat_list; + ); + + if not (null !stat_list) + then begin + Parsing_stat.print_recurring_problematic_tokens !stat_list; + Parsing_stat.print_parsing_stat_list !stat_list; + end; + () @@ -322,6 +378,57 @@ let test_cpp file = +let extract_macros ~selection x = + (* CONFIG [ch] ? also do for .c ? maybe less needed now that I + * add local_macros. + *) + + let ext = "h" in + let fullxs = Common.files_of_dir_or_files_no_vcs ext [x] in + fullxs +> List.iter (fun file -> + + pr ("/* PARSING: " ^ file ^ " */"); + let xs = Parse_c.parse_cpp_define_file file in + xs +> List.iter (fun (x, def) -> + let (s, params, body) = def in + assert(s = x); + (match params, body with + | Cpp_token_c.NoParam, Cpp_token_c.DefineBody [Parser_c.TInt _] + | Cpp_token_c.NoParam, Cpp_token_c.DefineBody [] -> + () + | _ -> + + let s1 = + match params with + | Cpp_token_c.NoParam -> spf "#define %s " s + | Cpp_token_c.Params xs -> + spf "#define %s(%s) " + s (Common.join "," xs) + in + let s2, bodytoks = + match body with + | Cpp_token_c.DefineHint _ -> + failwith "weird, hint in regular header file" + | Cpp_token_c.DefineBody xs -> + Common.join " " (xs +> List.map Token_helpers.str_of_tok), + xs + in + + let print = + match () with + | () when s ==~ Parsing_hacks.regexp_annot -> true + | () when List.exists (function + | Parser_c.Tattribute _ -> true + | _ -> false) bodytoks -> true + | () -> false + in + if print || not selection then pr (s1 ^ s2) + ); + ); + ); + () + + (* ---------------------------------------------------------------------- *) let test_xxx a = @@ -354,6 +461,9 @@ let actions () = [ "-parse_ch", " ", Common.mk_action_n_arg test_parse_ch; + "-parse", " ", + Common.mk_action_n_arg test_parse; + "-show_flow", " ", Common.mk_action_1_arg test_cfg; "-control_flow", " ", @@ -377,6 +487,11 @@ let actions () = [ "-test_cpp", " ", Common.mk_action_1_arg test_cpp; + "-extract_macros", " ", + Common.mk_action_1_arg (extract_macros ~selection:false) ; + + "-extract_macros_select", " ", + Common.mk_action_1_arg (extract_macros ~selection:true); "-xxx", " <>", diff --git a/parsing_c/token_c.ml b/parsing_c/token_c.ml index d896141..7c8e6e7 100644 --- a/parsing_c/token_c.ml +++ b/parsing_c/token_c.ml @@ -28,8 +28,8 @@ open Common * so that ast_c does not need to depend on yacc which depends on * ast_c, etc. * - * Also, OcamlYacc imposes some stupid constraints on the way we can define - * the token type. OcamlYacc force us to do a token type that + * Also, ocamlyacc imposes some stupid constraints on the way we can define + * the token type. ocamlyacc forces us to do a token type that * cant be a pair of a sum type, it must be directly a sum type. * We don't have this constraint here. * diff --git a/parsing_c/token_helpers.ml b/parsing_c/token_helpers.ml index cefa5e9..d7e60ca 100644 --- a/parsing_c/token_helpers.ml +++ b/parsing_c/token_helpers.ml @@ -117,11 +117,17 @@ let is_cbrace = function (* ---------------------------------------------------------------------- *) + +(* end of file *) let is_eof = function | EOF x -> true | _ -> false +(* end of macro *) +let is_eom = function + | TDefEOL _ -> true + | _ -> false let is_statement = function | Tfor _ | Tdo _ | Tif _ | Twhile _ | Treturn _ @@ -193,7 +199,6 @@ let is_ident_like = function | TMacroStmt _ | TMacroString _ | TMacroDecl _ - | TMacroStructDecl _ | TMacroDeclConst _ | TMacroIterator _ -> true @@ -247,7 +252,6 @@ let info_of_tok = function | TMacroStmt (s, i) -> i | TMacroString (s, i) -> i | TMacroDecl (s, i) -> i - | TMacroStructDecl (s, i) -> i | TMacroDeclConst (i) -> i | TMacroIterator (s,i) -> i (* | TMacroTop (s,i) -> i *) @@ -397,7 +401,6 @@ let visitor_info_of_tok f = function | TMacroStmt (s, i) -> TMacroStmt (s, f i) | TMacroString (s, i) -> TMacroString (s, f i) | TMacroDecl (s, i) -> TMacroDecl (s, f i) - | TMacroStructDecl (s, i) -> TMacroStructDecl (s, f i) | TMacroDeclConst (i) -> TMacroDeclConst (f i) | TMacroIterator (s, i) -> TMacroIterator (s, f i) (* | TMacroTop (s,i) -> TMacroTop (s,f i) *) diff --git a/parsing_c/token_helpers.mli b/parsing_c/token_helpers.mli index bcb1fcd..3fff96d 100644 --- a/parsing_c/token_helpers.mli +++ b/parsing_c/token_helpers.mli @@ -15,6 +15,8 @@ val is_cpp_instruction : Parser_c.token -> bool val is_gcc_token : Parser_c.token -> bool val is_eof : Parser_c.token -> bool +val is_eom : Parser_c.token -> bool + val is_statement : Parser_c.token -> bool val is_start_of_something : Parser_c.token -> bool val is_binary_operator : Parser_c.token -> bool diff --git a/parsing_c/token_views_c.ml b/parsing_c/token_views_c.ml new file mode 100644 index 0000000..6b3a4fb --- /dev/null +++ b/parsing_c/token_views_c.ml @@ -0,0 +1,500 @@ +(* Yoann Padioleau + * + * Copyright (C) 2007, 2008 Ecole des Mines de Nantes + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License (GPL) + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * file license.txt for more details. + *) + +open Common + +module TH = Token_helpers + +open Parser_c + +(*****************************************************************************) +(* Some debugging functions *) +(*****************************************************************************) + +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_parsing + +(* ------------------------------------------------------------------------- *) +(* fuzzy parsing, different "views" over the same program *) +(* ------------------------------------------------------------------------- *) + + +(* Normally I should not use ref/mutable in the token_extended type + * and I should have a set of functions taking a list of tokens and + * returning a list of tokens. The problem is that to make easier some + * functions, it is better to work on better representation, on "views" + * over this list of tokens. But then modifying those views and get + * back from those views to the original simple list of tokens is + * tedious. One way is to maintain next to the view a list of "actions" + * (I was using a hash storing the charpos of the token and associating + * the action) but it is tedious too. Simpler to use mutable/ref. We + * use the same idea that we use when working on the Ast_c. *) + +(* old: when I was using the list of "actions" next to the views, the hash + * indexed by the charpos, there could have been some problems: + * how my fake_pos interact with the way I tag and adjust token ? + * because I base my tagging on the position of the token ! so sometimes + * could tag another fakeInfo that should not be tagged ? + * fortunately I don't use anymore this technique. + *) + +(* update: quite close to the Place_c.Inxxx *) +type context = + InFunction | InEnum | InStruct | InInitializer | NoContext + +type token_extended = { + mutable tok: Parser_c.token; + mutable where: context; + + (* less: need also a after ? *) + mutable new_tokens_before : Parser_c.token list; + + (* line x col cache, more easily accessible, of the info in the token *) + line: int; + col : int; +} + +(* todo? is it ok to reset as a comment a TDefEOL ? if do that, then + * can confuse the parser. + *) +let set_as_comment cppkind x = + if TH.is_eof x.tok + then () (* otherwise parse_c will be lost if don't find a EOF token *) + else + x.tok <- TCommentCpp (cppkind, TH.info_of_tok x.tok) + +let mk_token_extended x = + let (line, col) = TH.linecol_of_tok x in + { tok = x; + line = line; col = col; + where = NoContext; + new_tokens_before = []; + } + + +let rebuild_tokens_extented toks_ext = + let _tokens = ref [] in + toks_ext +> List.iter (fun tok -> + tok.new_tokens_before +> List.iter (fun x -> push2 x _tokens); + push2 tok.tok _tokens + ); + let tokens = List.rev !_tokens in + (tokens +> acc_map mk_token_extended) + + + +(* x list list, because x list separated by ',' *) +type paren_grouped = + | Parenthised of paren_grouped list list * token_extended list + | PToken of token_extended + +type brace_grouped = + | Braceised of + brace_grouped list list * token_extended * token_extended option + | BToken of token_extended + +(* Far better data structure than doing hacks in the lexer or parser + * because in lexer we don't know to which ifdef a endif is related + * and so when we want to comment a ifdef, we don't know which endif + * we must also comment. Especially true for the #if 0 which sometimes + * have a #else part. + * + * x list list, because x list separated by #else or #elif + *) +type ifdef_grouped = + | Ifdef of ifdef_grouped list list * token_extended list + | Ifdefbool of bool * ifdef_grouped list list * token_extended list + | NotIfdefLine of token_extended list + + +type 'a line_grouped = + Line of 'a list + + +type body_function_grouped = + | BodyFunction of token_extended list + | NotBodyLine of token_extended list + + +(* ------------------------------------------------------------------------- *) +(* view builders *) +(* ------------------------------------------------------------------------- *) + +(* todo: synchro ! use more indentation + * if paren not closed and same indentation level, certainly because + * part of a mid-ifdef-expression. +*) +let rec mk_parenthised xs = + match xs with + | [] -> [] + | x::xs -> + (match x.tok with + | TOPar _ | TOParDefine _ -> + let body, extras, xs = mk_parameters [x] [] xs in + Parenthised (body,extras)::mk_parenthised xs + | _ -> + PToken x::mk_parenthised xs + ) + +(* return the body of the parenthised expression and the rest of the tokens *) +and mk_parameters extras acc_before_sep xs = + match xs with + | [] -> + (* maybe because of #ifdef which "opens" '(' in 2 branches *) + pr2 "PB: not found closing paren in fuzzy parsing"; + [List.rev acc_before_sep], List.rev extras, [] + | x::xs -> + (match x.tok with + (* synchro *) + | TOBrace _ when x.col =|= 0 -> + pr2 "PB: found synchro point } in paren"; + [List.rev acc_before_sep], List.rev (extras), (x::xs) + + | TCPar _ | TCParEOL _ -> + [List.rev acc_before_sep], List.rev (x::extras), xs + | TOPar _ | TOParDefine _ -> + let body, extrasnest, xs = mk_parameters [x] [] xs in + mk_parameters extras + (Parenthised (body,extrasnest)::acc_before_sep) + xs + | TComma _ -> + let body, extras, xs = mk_parameters (x::extras) [] xs in + (List.rev acc_before_sep)::body, extras, xs + | _ -> + mk_parameters extras (PToken x::acc_before_sep) xs + ) + + + + +let rec mk_braceised xs = + match xs with + | [] -> [] + | x::xs -> + (match x.tok with + | TOBrace _ -> + let body, endbrace, xs = mk_braceised_aux [] xs in + Braceised (body, x, endbrace)::mk_braceised xs + | TCBrace _ -> + pr2 "PB: found closing brace alone in fuzzy parsing"; + BToken x::mk_braceised xs + | _ -> + BToken x::mk_braceised xs + ) + +(* return the body of the parenthised expression and the rest of the tokens *) +and mk_braceised_aux acc xs = + match xs with + | [] -> + (* maybe because of #ifdef which "opens" '(' in 2 branches *) + pr2 "PB: not found closing brace in fuzzy parsing"; + [List.rev acc], None, [] + | x::xs -> + (match x.tok with + | TCBrace _ -> [List.rev acc], Some x, xs + | TOBrace _ -> + let body, endbrace, xs = mk_braceised_aux [] xs in + mk_braceised_aux (Braceised (body,x, endbrace)::acc) xs + | _ -> + mk_braceised_aux (BToken x::acc) xs + ) + + + + +let rec mk_ifdef xs = + match xs with + | [] -> [] + | x::xs -> + (match x.tok with + | TIfdef _ -> + let body, extra, xs = mk_ifdef_parameters [x] [] xs in + Ifdef (body, extra)::mk_ifdef xs + | TIfdefBool (b,_, _) -> + let body, extra, xs = mk_ifdef_parameters [x] [] xs in + + (* if not passing, then consider a #if 0 as an ordinary #ifdef *) + if !Flag_parsing_c.if0_passing + then Ifdefbool (b, body, extra)::mk_ifdef xs + else Ifdef(body, extra)::mk_ifdef xs + + | TIfdefMisc (b,_,_) | TIfdefVersion (b,_,_) -> + let body, extra, xs = mk_ifdef_parameters [x] [] xs in + Ifdefbool (b, body, extra)::mk_ifdef xs + + + | _ -> + (* todo? can have some Ifdef in the line ? *) + let line, xs = Common.span (fun y -> y.line =|= x.line) (x::xs) in + NotIfdefLine line::mk_ifdef xs + ) + +and mk_ifdef_parameters extras acc_before_sep xs = + match xs with + | [] -> + (* Note that mk_ifdef is assuming that CPP instruction are alone + * on their line. Because I do a span (fun x -> is_same_line ...) + * I might take with me a #endif if this one is mixed on a line + * with some "normal" tokens. + *) + pr2 "PB: not found closing ifdef in fuzzy parsing"; + [List.rev acc_before_sep], List.rev extras, [] + | x::xs -> + (match x.tok with + | TEndif _ -> + [List.rev acc_before_sep], List.rev (x::extras), xs + | TIfdef _ -> + let body, extrasnest, xs = mk_ifdef_parameters [x] [] xs in + mk_ifdef_parameters + extras (Ifdef (body, extrasnest)::acc_before_sep) xs + + | TIfdefBool (b,_,_) -> + let body, extrasnest, xs = mk_ifdef_parameters [x] [] xs in + + if !Flag_parsing_c.if0_passing + then + mk_ifdef_parameters + extras (Ifdefbool (b, body, extrasnest)::acc_before_sep) xs + else + mk_ifdef_parameters + extras (Ifdef (body, extrasnest)::acc_before_sep) xs + + + | TIfdefMisc (b,_,_) | TIfdefVersion (b,_,_) -> + let body, extrasnest, xs = mk_ifdef_parameters [x] [] xs in + mk_ifdef_parameters + extras (Ifdefbool (b, body, extrasnest)::acc_before_sep) xs + + | TIfdefelse _ + | TIfdefelif _ -> + let body, extras, xs = mk_ifdef_parameters (x::extras) [] xs in + (List.rev acc_before_sep)::body, extras, xs + | _ -> + let line, xs = Common.span (fun y -> y.line =|= x.line) (x::xs) in + mk_ifdef_parameters extras (NotIfdefLine line::acc_before_sep) xs + ) + +(* --------------------------------------- *) + +let line_of_paren = function + | PToken x -> x.line + | Parenthised (xxs, info_parens) -> + (match info_parens with + | [] -> raise Impossible + | x::xs -> x.line + ) + + +let rec span_line_paren line = function + | [] -> [],[] + | x::xs -> + (match x with + | PToken tok when TH.is_eof tok.tok -> + [], x::xs + | _ -> + if line_of_paren x =|= line + then + let (l1, l2) = span_line_paren line xs in + (x::l1, l2) + else ([], x::xs) + ) + + +let rec mk_line_parenthised xs = + match xs with + | [] -> [] + | x::xs -> + let line_no = line_of_paren x in + let line, xs = span_line_paren line_no xs in + Line (x::line)::mk_line_parenthised xs + + +(* --------------------------------------- *) +let rec mk_body_function_grouped xs = + match xs with + | [] -> [] + | x::xs -> + (match x with + | {tok = TOBrace _; col = 0} -> + let is_closing_brace = function + | {tok = TCBrace _; col = 0 } -> true + | _ -> false + in + let body, xs = Common.span (fun x -> not (is_closing_brace x)) xs in + (match xs with + | ({tok = TCBrace _; col = 0 })::xs -> + BodyFunction body::mk_body_function_grouped xs + | [] -> + pr2 "PB:not found closing brace in fuzzy parsing"; + [NotBodyLine body] + | _ -> raise Impossible + ) + + | _ -> + let line, xs = Common.span (fun y -> y.line =|= x.line) (x::xs) in + NotBodyLine line::mk_body_function_grouped xs + ) + + +(* ------------------------------------------------------------------------- *) +(* view iterators *) +(* ------------------------------------------------------------------------- *) + +let rec iter_token_paren f xs = + xs +> List.iter (function + | PToken tok -> f tok; + | Parenthised (xxs, info_parens) -> + info_parens +> List.iter f; + xxs +> List.iter (fun xs -> iter_token_paren f xs) + ) + +let rec iter_token_brace f xs = + xs +> List.iter (function + | BToken tok -> f tok; + | Braceised (xxs, tok1, tok2opt) -> + f tok1; do_option f tok2opt; + xxs +> List.iter (fun xs -> iter_token_brace f xs) + ) + +let rec iter_token_ifdef f xs = + xs +> List.iter (function + | NotIfdefLine xs -> xs +> List.iter f; + | Ifdefbool (_, xxs, info_ifdef) + | Ifdef (xxs, info_ifdef) -> + info_ifdef +> List.iter f; + xxs +> List.iter (iter_token_ifdef f) + ) + + + + +let tokens_of_paren xs = + let g = ref [] in + xs +> iter_token_paren (fun tok -> push2 tok g); + List.rev !g + + +let tokens_of_paren_ordered xs = + let g = ref [] in + + let rec aux_tokens_ordered = function + | PToken tok -> push2 tok g; + | Parenthised (xxs, info_parens) -> + let (opar, cpar, commas) = + match info_parens with + | opar::xs -> + (match List.rev xs with + | cpar::xs -> + opar, cpar, List.rev xs + | _ -> raise Impossible + ) + | _ -> raise Impossible + in + push2 opar g; + aux_args (xxs,commas); + push2 cpar g; + + and aux_args (xxs, commas) = + match xxs, commas with + | [], [] -> () + | [xs], [] -> xs +> List.iter aux_tokens_ordered + | xs::ys::xxs, comma::commas -> + xs +> List.iter aux_tokens_ordered; + push2 comma g; + aux_args (ys::xxs, commas) + | _ -> raise Impossible + + in + + xs +> List.iter aux_tokens_ordered; + List.rev !g + + + +(* ------------------------------------------------------------------------- *) +(* set the context info in token *) +(* ------------------------------------------------------------------------- *) + + +let rec set_in_function_tag xs = + (* could try: ) { } but it can be the ) of a if or while, so + * better to base the heuristic on the position in column zero. + * Note that some struct or enum or init put also their { in first column + * but set_in_other will overwrite the previous InFunction tag. + *) + match xs with + | [] -> () + (* ) { and the closing } is in column zero, then certainly a function *) + | BToken ({tok = TCPar _ })::(Braceised (body, tok1, Some tok2))::xs + when tok1.col <> 0 && tok2.col =|= 0 -> + body +> List.iter (iter_token_brace (fun tok -> + tok.where <- InFunction + )); + set_in_function_tag xs + + | (BToken x)::xs -> set_in_function_tag xs + + | (Braceised (body, tok1, Some tok2))::xs + when tok1.col =|= 0 && tok2.col =|= 0 -> + body +> List.iter (iter_token_brace (fun tok -> + tok.where <- InFunction + )); + set_in_function_tag xs + | Braceised (body, tok1, tok2)::xs -> + set_in_function_tag xs + + +let rec set_in_other xs = + match xs with + | [] -> () + (* enum x { } *) + | BToken ({tok = Tenum _})::BToken ({tok = TIdent _}) + ::Braceised(body, tok1, tok2)::xs + | BToken ({tok = Tenum _}) + ::Braceised(body, tok1, tok2)::xs + -> + body +> List.iter (iter_token_brace (fun tok -> + tok.where <- InEnum; + )); + set_in_other xs + + (* struct x { } *) + | BToken ({tok = Tstruct _})::BToken ({tok = TIdent _}) + ::Braceised(body, tok1, tok2)::xs -> + body +> List.iter (iter_token_brace (fun tok -> + tok.where <- InStruct; + )); + set_in_other xs + (* = { } *) + | BToken ({tok = TEq _}) + ::Braceised(body, tok1, tok2)::xs -> + body +> List.iter (iter_token_brace (fun tok -> + tok.where <- InInitializer; + )); + set_in_other xs + + | BToken _::xs -> set_in_other xs + + | Braceised(body, tok1, tok2)::xs -> + body +> List.iter set_in_other; + set_in_other xs + + + + +let set_context_tag xs = + begin + set_in_function_tag xs; + set_in_other xs; + end + diff --git a/parsing_c/token_views_c.mli b/parsing_c/token_views_c.mli new file mode 100644 index 0000000..804552b --- /dev/null +++ b/parsing_c/token_views_c.mli @@ -0,0 +1,62 @@ + +type context = InFunction | InEnum | InStruct | InInitializer | NoContext + +type token_extended = { + mutable tok : Parser_c.token; + mutable where : context; + mutable new_tokens_before : Parser_c.token list; + line : int; + col : int; +} +val mk_token_extended : Parser_c.token -> token_extended + +val rebuild_tokens_extented : token_extended list -> token_extended list + +(* ---------------------------------------------------------------------- *) +type paren_grouped = + Parenthised of paren_grouped list list * token_extended list + | PToken of token_extended + +type brace_grouped = + Braceised of brace_grouped list list * token_extended * + token_extended option + | BToken of token_extended + +type ifdef_grouped = + Ifdef of ifdef_grouped list list * token_extended list + | Ifdefbool of bool * ifdef_grouped list list * token_extended list + | NotIfdefLine of token_extended list + +type 'a line_grouped = Line of 'a list + +type body_function_grouped = + BodyFunction of token_extended list + | NotBodyLine of token_extended list + +(* ---------------------------------------------------------------------- *) +val mk_parenthised : token_extended list -> paren_grouped list +val mk_braceised : token_extended list -> brace_grouped list +val mk_ifdef : token_extended list -> ifdef_grouped list +val mk_line_parenthised : + paren_grouped list -> paren_grouped line_grouped list +val mk_body_function_grouped : + token_extended list -> body_function_grouped list + +val line_of_paren : paren_grouped -> int +val span_line_paren : + int -> paren_grouped list -> paren_grouped list * paren_grouped list + +(* ---------------------------------------------------------------------- *) +val iter_token_paren : (token_extended -> unit) -> paren_grouped list -> unit +val iter_token_brace : (token_extended -> unit) -> brace_grouped list -> unit +val iter_token_ifdef : (token_extended -> unit) -> ifdef_grouped list -> unit + +val tokens_of_paren : paren_grouped list -> token_extended list +val tokens_of_paren_ordered : paren_grouped list -> token_extended list + +(* ---------------------------------------------------------------------- *) +val set_context_tag: brace_grouped list -> unit + +(* ---------------------------------------------------------------------- *) +val set_as_comment : Token_c.cppcommentkind -> token_extended -> unit + diff --git a/parsing_c/type_annoter_c.ml b/parsing_c/type_annoter_c.ml index 0707df8..7b8ef84 100644 --- a/parsing_c/type_annoter_c.ml +++ b/parsing_c/type_annoter_c.ml @@ -94,13 +94,7 @@ module Lib = Lib_parsing_c (*****************************************************************************) (* Wrappers *) (*****************************************************************************) -let pr2 s = - if !Flag_parsing_c.verbose_type - then Common.pr2 s - -let pr2_once s = - if !Flag_parsing_c.verbose_type - then Common.pr2_once s +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_type (*****************************************************************************) (* Environment *) @@ -161,6 +155,7 @@ type namedef = | VarOrFunc of string * Ast_c.exp_type | EnumConstant of string * string option + (* also used for macro type aliases *) | TypeDef of string * fullType (* the structType contains nested "idents" with struct scope *) | StructUnionNameDef of string * (structUnion * structType) wrap @@ -354,7 +349,7 @@ let rec type_unfold_one_step ty env = | StructUnionName (su, s) -> (try let (((su,fields),ii), env') = lookup_structunion (su, s) env in - Ast_c.nQ, (StructUnion (su, Some s, fields), ii) + Ast_c.mk_ty (StructUnion (su, Some s, fields)) ii (* old: +> Ast_c.rewrap_typeC ty * but must wrap with good ii, otherwise pretty_print_c * will be lost and raise some Impossible @@ -466,15 +461,13 @@ let type_of_s a = * I now add a fake parse_info for such default int so no more failwith * normally. *) -let offset (_,(ty,iis)) = - match ty, iis with - | TypeName (name, _typ), [] -> - (match name with - | RegularName (s, [ii]) -> ii.Ast_c.pinfo - | _ -> raise Todo - ) - | _, ii::_ -> ii.Ast_c.pinfo - | _ -> failwith "type has no text; need to think again" +let offset ft = + let (qu, ty) = ft in + (* bugfix: because of string->name, the ii can be deeper *) + let ii = Ast_c.get_local_ii_of_tybis_inlining_ii_of_name ty in + match ii with + | ii::_ -> ii.Ast_c.pinfo + | [] -> failwith "type has no text; need to think again" @@ -629,13 +622,24 @@ let annotater_expr_visitor_subpart = (fun (k,bigf) expr -> | Constant (String (s,kind)) -> make_info_def (type_of_s "char *") | Constant MultiString _ -> make_info_def (type_of_s "char *") | Constant (Char (s,kind)) -> make_info_def (type_of_s "char") - | Constant (Int (s)) -> make_info_def (type_of_s "int") + | Constant (Int (s,kind)) -> + (* this seems really unpleasant, but perhaps the type needs to be set + up in some way that allows pretty printing *) + make_info_def + (match kind with + (* matches limited by what is generated in lexer_c.mll *) + Si(Signed,CInt) -> type_of_s "int" + | Si(UnSigned,CInt) -> type_of_s "unsigned int" + | Si(Signed,CLong) -> type_of_s "long" + | Si(UnSigned,CLong) -> type_of_s "unsigned long" + | Si(Signed,CLongLong) -> type_of_s "long long" + | Si(UnSigned,CLongLong) -> type_of_s "unsigned long long" + | _ -> failwith "unexpected kind for constant") | Constant (Float (s,kind)) -> let fake = Ast_c.fakeInfo (Common.fake_parse_info) in let fake = Ast_c.rewrap_str "float" fake in let iinull = [fake] in - make_info_def - (Ast_c.nQ, (BaseType (FloatType kind), iinull)) + make_info_def (Ast_c.mk_ty (BaseType (FloatType kind)) iinull) (* -------------------------------------------------- *) @@ -648,7 +652,9 @@ let annotater_expr_visitor_subpart = (fun (k,bigf) expr -> * Also as I don't want a warning on the Ident that are a FunCall, * easier to have a rule separate from the Ident rule. *) - | FunCall (((Ident (ident), typ), _ii) as e1, args) -> + | FunCall (e1, args) -> + (match Ast_c.unwrap_expr e1 with + | Ident (ident) -> (* recurse *) args +> List.iter (fun (e,ii) -> @@ -715,10 +721,10 @@ let annotater_expr_visitor_subpart = (fun (k,bigf) expr -> ) - | FunCall (e, args) -> + | _e -> k expr; - (Ast_c.get_type_expr e) +> Type_c.do_with_type (fun typ -> + (Ast_c.get_type_expr e1) +> Type_c.do_with_type (fun typ -> (* copy paste of above *) (match unwrap_unfold_env typ with | FunctionType (ret, params) -> make_info_def ret @@ -730,6 +736,7 @@ let annotater_expr_visitor_subpart = (fun (k,bigf) expr -> | _ -> Type_c.noTypeHere ) ) + ) (* -------------------------------------------------- *) @@ -800,7 +807,7 @@ let annotater_expr_visitor_subpart = (fun (k,bigf) expr -> let fake = Ast_c.fakeInfo Common.fake_parse_info in let fake = Ast_c.rewrap_str "*" fake in - let ft = (Ast_c.nQ, (Pointer t, [fake])) in + let ft = Ast_c.mk_ty (Pointer t) [fake] in make_info_def_fix ft ) @@ -867,10 +874,14 @@ let annotater_expr_visitor_subpart = (fun (k,bigf) expr -> k expr; Ast_c.get_type_expr e2 + | Binary (e1, Logical _, e2) -> + k expr; + make_info_def (type_of_s "int") + (* todo: lub *) - | Binary (e1, op, e2) -> + | Binary (e1, Arith op, e2) -> k expr; - Type_c.lub (Type_c.get_opt_type e1) (Type_c.get_opt_type e2) + Type_c.lub op (Type_c.get_opt_type e1) (Type_c.get_opt_type e2) | CondExpr (cond, e1opt, e2) -> k expr; @@ -1027,8 +1038,8 @@ let rec visit_toplevel ~just_add_in_env ~depth elem = (* ------------------------------------------------------------ *) Visitor_c.kstatement = (fun (k, bigf) st -> - match st with - | Compound statxs, ii -> do_in_new_scope (fun () -> k st); + match Ast_c.unwrap_st st with + | Compound statxs -> do_in_new_scope (fun () -> k st); | _ -> k st ); (* ------------------------------------------------------------ *) @@ -1045,7 +1056,7 @@ let rec visit_toplevel ~just_add_in_env ~depth elem = let local = match local with | Ast_c.NotLocalDecl -> Ast_c.NotLocalVar - | Ast_c.LocalDecl -> Ast_c.LocalVar (offset t) + | Ast_c.LocalDecl -> Ast_c.LocalVar (offset t) in var +> Common.do_option (fun (name, iniopt) -> @@ -1080,17 +1091,18 @@ let rec visit_toplevel ~just_add_in_env ~depth elem = * the ref of abstract-lined types, but the real one, so * don't al_type here *) - let (_q, t) = typ in - match t with - | StructUnion (su, Some s, structType),ii -> + let (_q, tbis) = typ in + match Ast_c.unwrap_typeC typ with + | StructUnion (su, Some s, structType) -> let structType' = Lib.al_fields structType in + let ii = Ast_c.get_ii_typeC_take_care tbis in let ii' = Lib.al_ii ii in add_binding (StructUnionNameDef (s, ((su, structType'),ii'))) true; if need_annotate_body then k typ (* todo: restrict ? new scope so use do_in_scope ? *) - | Enum (sopt, enums), ii -> + | Enum (sopt, enums) -> enums +> List.iter (fun ((name, eopt), iicomma) -> @@ -1137,7 +1149,7 @@ let rec visit_toplevel ~just_add_in_env ~depth elem = (match oldstyle with | None -> let typ' = - Lib.al_type (Ast_c.nQ, (FunctionType ftyp, [i1;i2])) in + Lib.al_type (Ast_c.mk_ty (FunctionType ftyp) [i1;i2]) in add_binding (VarOrFunc (funcs, (typ',islocal i1.Ast_c.pinfo))) false; @@ -1170,9 +1182,17 @@ let rec visit_toplevel ~just_add_in_env ~depth elem = ); ); + | CppTop x -> + (match x with + | Define ((s,ii), (DefineVar, DefineType t)) -> + add_binding (TypeDef (s,Lib.al_type t)) true; + | _ -> k elem + ) + | Declaration _ - | CppTop _ + + | IfdefTop _ | MacroTop _ | EmptyDef _ @@ -1236,14 +1256,14 @@ let annotate_test_expressions prog = let bigf = { Visitor_c.default_visitor_c with Visitor_c.kexpr = (fun (k,bigf) expr -> - (match unwrap expr with - (CondExpr(e,_,_),_) -> propagate_test e + (match unwrap_expr expr with + CondExpr(e,_,_) -> propagate_test e | _ -> () ); k expr ); Visitor_c.kstatement = (fun (k, bigf) st -> - match unwrap st with + match unwrap_st st with Selection(s) -> (match s with If(e1,s1,s2) -> propagate_test e1 | _ -> ()); k st; diff --git a/parsing_c/type_c.ml b/parsing_c/type_c.ml index 5edbdd2..29bc3d1 100644 --- a/parsing_c/type_c.ml +++ b/parsing_c/type_c.ml @@ -1,6 +1,6 @@ -(* Yoann Padioleau +(* Yoann Padioleau, Julia Lawall * - * Copyright (C) 2007, 2008, 2009 University of Urbana Champaign + * Copyright (C) 2007, 2008, 2009 University of Urbana Champaign and DIKU * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License (GPL) @@ -16,6 +16,11 @@ open Common open Ast_c +(*****************************************************************************) +(* Wrappers *) +(*****************************************************************************) +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_type + (*****************************************************************************) (* Types *) (*****************************************************************************) @@ -63,6 +68,28 @@ type completed_and_simplified = Ast_c.fullType type completed_typedef = Ast_c.fullType type removed_typedef = Ast_c.fullType +(* move in ast_c ? + * use Ast_c.nQ, Ast_c.defaultInt, Ast_c.emptyAnnotCocci, + * Ast_c.emptyMetavarsBinding, Ast_c.emptyComments +*) +let (int_type: Ast_c.fullType) = + (* Lib_parsing_c.al_type (Parse_c.type_of_string "int")*) + Ast_c.mk_ty + (Ast_c.BaseType (Ast_c.IntType (Ast_c.Si (Ast_c.Signed, Ast_c.CInt)))) + [Ast_c.al_info 0 (* al *) + {Ast_c.pinfo = + Ast_c.OriginTok + {Common.str = "int"; Common.charpos = 0; Common.line = -1; + Common.column = -1; Common.file = ""}; + Ast_c.cocci_tag = + {contents = Some (Ast_cocci.CONTEXT (Ast_cocci.NoPos, Ast_cocci.NOTHING), [])}; + Ast_c.comments_tag = {contents = + {Ast_c.mbefore = []; Ast_c.mafter = []; + Ast_c.mbefore2 = []; Ast_c.mafter2 = [] + }}}] + + + (* normally if the type annotated has done a good job, this should always * return true. Cf type_annotater_c.typedef_fix. @@ -143,9 +170,6 @@ let noTypeHere = (None, Ast_c.NotTest) - - - let do_with_type f (t,_test) = match t with | None -> noTypeHere @@ -164,12 +188,14 @@ let get_opt_type e = let structdef_to_struct_name ty = - match ty with - | qu, (StructUnion (su, sopt, fields), iis) -> - (match sopt,iis with + let (qu, tybis) = ty in + match Ast_c.unwrap_typeC ty with + | (StructUnion (su, sopt, fields)) -> + let iis = Ast_c.get_ii_typeC_take_care tybis in + (match sopt, iis with (* todo? but what if correspond to a nested struct def ? *) | Some s , [i1;i2;i3;i4] -> - qu, (StructUnionName (su, s), [i1;i2]) + qu, Ast_c.mk_tybis (StructUnionName (su, s)) [i1;i2] | None, _ -> ty | x -> raise Impossible @@ -192,7 +218,7 @@ let type_of_function (def,ii) = let fake = Ast_c.fakeInfo (Common.fake_parse_info) in let fake_cparen = Ast_c.rewrap_str ")" fake in - Ast_c.nQ, (FunctionType ftyp, [fake_oparen;fake_cparen]) + Ast_c.mk_ty (FunctionType ftyp) [fake_oparen;fake_cparen] (* pre: only a single variable *) @@ -277,7 +303,7 @@ let (fake_function_type: rettype +> Common.map_option (fun rettype -> let (ftyp: functionType) = (rettype, (tyargs, (false,[]))) in let (t: fullType) = - (Ast_c.nQ, (FunctionType ftyp, [fake_oparen;fake_cparen])) + Ast_c.mk_ty (FunctionType ftyp) [fake_oparen;fake_cparen] in t ) @@ -301,7 +327,7 @@ let (fake_function_type: * | (T.Pointer(ty1),ty2) -> T.Pointer(ty1) * *) -let lub t1 t2 = +let lub op t1 t2 = let ftopt = match t1, t2 with | None, None -> None @@ -321,9 +347,55 @@ let lub t1 t2 = | Some t1, Some t2 -> let t1bis = Ast_c.unwrap_typeC t1 in let t2bis = Ast_c.unwrap_typeC t2 in - (match t1bis, t2bis with + (* a small attempt to do better, no consideration of typedefs *) + (match op, t1bis, t2bis with + (* these rules follow ANSI C. See eg: + http://flexor.uwaterloo.ca/library/SGI_bookshelves/SGI_Developer/books/CLanguageRef/sgi_html/ch05.html *) + _,Ast_c.BaseType(bt1),Ast_c.BaseType(bt2) -> + (match bt1,bt2 with + Ast_c.Void,_ -> Some t2 (* something has gone wrong *) + | _,Ast_c.Void -> Some t1 (* something has gone wrong *) + | Ast_c.FloatType(Ast_c.CLongDouble),_ -> Some t1 + | _,Ast_c.FloatType(Ast_c.CLongDouble) -> Some t2 + | Ast_c.FloatType(Ast_c.CDouble),_ -> Some t1 + | _,Ast_c.FloatType(Ast_c.CDouble) -> Some t2 + | Ast_c.FloatType(Ast_c.CFloat),_ -> Some t1 + | _,Ast_c.FloatType(Ast_c.CFloat) -> Some t2 + + | Ast_c.IntType(Ast_c.Si(Ast_c.UnSigned,Ast_c.CLongLong)),_ -> + Some t1 + | _,Ast_c.IntType(Ast_c.Si(Ast_c.UnSigned,Ast_c.CLongLong)) -> + Some t2 + | Ast_c.IntType(Ast_c.Si(Ast_c.Signed,Ast_c.CLongLong)),_ -> + Some t1 + | _,Ast_c.IntType(Ast_c.Si(Ast_c.Signed,Ast_c.CLongLong)) -> + Some t2 + | Ast_c.IntType(Ast_c.Si(Ast_c.UnSigned,Ast_c.CLong)),_ -> + Some t1 + | _,Ast_c.IntType(Ast_c.Si(Ast_c.UnSigned,Ast_c.CLong)) -> + Some t2 + | Ast_c.IntType(Ast_c.Si(Ast_c.Signed,Ast_c.CLong)),_ -> + Some t1 + | _,Ast_c.IntType(Ast_c.Si(Ast_c.Signed,Ast_c.CLong)) -> + Some t2 + | Ast_c.IntType(Ast_c.Si(Ast_c.UnSigned,Ast_c.CInt)),_ -> + Some t1 + | _,Ast_c.IntType(Ast_c.Si(Ast_c.UnSigned,Ast_c.CInt)) -> + Some t2 + | _ -> Some int_type) + + | Ast_c.Plus,Ast_c.Pointer _,Ast_c.BaseType(Ast_c.IntType _) -> + Some t1 + | Ast_c.Plus,Ast_c.BaseType(Ast_c.IntType _),Ast_c.Pointer _ -> + Some t2 + | Ast_c.Minus,Ast_c.Pointer _,Ast_c.BaseType(Ast_c.IntType _) -> + Some t1 + | Ast_c.Minus,Ast_c.BaseType(Ast_c.IntType _),Ast_c.Pointer _ -> + Some t2 + | Ast_c.Minus,Ast_c.Pointer _,Ast_c.Pointer _ -> + Some int_type (* todo, Pointer, Typedef, etc *) - | _, _ -> Some t1 + | _, _, _ -> Some t1 ) in @@ -349,7 +421,7 @@ let (type_field: let rec aux_fields fields = fields +> List.iter (fun x -> - match Ast_c.unwrap x with + match x with | DeclarationField (FieldDeclList (onefield_multivars, iiptvirg)) -> onefield_multivars +> List.iter (fun (fieldkind, iicomma) -> match fieldkind with @@ -380,8 +452,8 @@ let (type_field: | _ -> () ) - | EmptyField -> () - | MacroStructDeclTodo -> pr2_once "DeclTodo"; () + | EmptyField info -> () + | MacroDeclField _ -> pr2_once "DeclTodo"; () | CppDirectiveStruct _ | IfdefStruct _ -> pr2_once "StructCpp"; diff --git a/parsing_c/type_c.mli b/parsing_c/type_c.mli index dfa6345..917e1b0 100644 --- a/parsing_c/type_c.mli +++ b/parsing_c/type_c.mli @@ -21,7 +21,7 @@ val type_field: (* typing rules *) val lub: - finalType option -> finalType option -> Ast_c.exp_info + Ast_c.arithOp -> finalType option -> finalType option -> Ast_c.exp_info (* helpers *) val structdef_to_struct_name: diff --git a/parsing_c/unparse_c.ml b/parsing_c/unparse_c.ml index 2c2a238..9380543 100644 --- a/parsing_c/unparse_c.ml +++ b/parsing_c/unparse_c.ml @@ -27,6 +27,11 @@ labels found in the control-flow graph *) +(*****************************************************************************) +(* Wrappers *) +(*****************************************************************************) +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_unparsing + (*****************************************************************************) (* Types used during the intermediate phases of the unparsing *) (*****************************************************************************) @@ -44,11 +49,15 @@ type token1 = * This type contains the whole information. Have all the tokens with this * type. *) +type min = + Min of (int list (* match numbers *) * int (* adjacency information *)) + | Ctx + type token2 = - | T2 of Parser_c.token * bool (* minus *) * + | T2 of Parser_c.token * min * int option (* orig index, abstracting away comments and space *) | Fake2 - | Cocci2 of string + | Cocci2 of string * int (* line *) * int (* lcol *) * int (* rcol *) | C2 of string | Indent_cocci2 | Unindent_cocci2 @@ -82,20 +91,27 @@ let info_of_token1 t = let str_of_token2 = function | T2 (t,_,_) -> TH.str_of_tok t | Fake2 -> "" - | Cocci2 s -> s + | Cocci2 (s,_,_,_) -> s | C2 s -> s | Indent_cocci2 -> "" | Unindent_cocci2 -> "" let print_token2 = function - | T2 (t,b,_) -> "T2:"^(if b then "-" else "")^TH.str_of_tok t + | T2 (t,b,_) -> + let b_str = + match b with + Min (index,adj) -> + Printf.sprintf "-%d[%s]" adj + (String.concat " " (List.map string_of_int index)) + | Ctx -> "" in + "T2:"^b_str^TH.str_of_tok t | Fake2 -> "" - | Cocci2 s -> "Cocci2:"^s + | Cocci2 (s,_,lc,rc) -> Printf.sprintf "Cocci2:%d:%d%s" lc rc s | C2 s -> "C2:"^s | Indent_cocci2 -> "Indent" | Unindent_cocci2 -> "Unindent" -let print_all_tokens2 l = +let simple_print_all_tokens2 l = List.iter (function x -> Printf.printf "%s " (print_token2 x)) l; Printf.printf "\n" @@ -132,8 +148,8 @@ let mcode_contain_plus = function | Ast_cocci.CONTEXT (_,Ast_cocci.NOTHING) -> false | Ast_cocci.CONTEXT _ -> true (* patch: when need full coccinelle transformation *) - | Ast_cocci.MINUS (_,[]) -> false - | Ast_cocci.MINUS (_,x::xs) -> true + | Ast_cocci.MINUS (_,_,_,[]) -> false + | Ast_cocci.MINUS (_,_,_,x::xs) -> true | Ast_cocci.PLUS -> raise Impossible let contain_plus info = @@ -242,6 +258,8 @@ let displace_fake_nodes toks = match fake_info with Some(bef,((Fake1 info) as fake),aft) -> (match !(info.cocci_tag) with + | Some x -> + (match x with (Ast_cocci.CONTEXT(_,Ast_cocci.BEFORE _),_) -> (* move the fake node forwards *) let (whitespace,rest) = Common.span is_whitespace aft in @@ -259,6 +277,9 @@ let displace_fake_nodes toks = failwith "fake node should not be before-after" | _ -> bef @ fake :: (loop aft) (* old: was removed when have simpler yacfe *) ) + | None -> + bef @ fake :: (loop aft) + ) | None -> toks | _ -> raise Impossible in loop toks @@ -315,11 +336,11 @@ let expand_mcode toks = in let expand_info t = - let (mcode,env) = !((info_of_token1 t).cocci_tag) in + let (mcode,env) = + Ast_c.mcode_and_env_of_cocciref ((info_of_token1 t).cocci_tag) in - let pr_cocci s = - push2 (Cocci2 s) toks_out - in + let pr_cocci s ln col rcol = + push2 (Cocci2(s,ln,col,rcol)) toks_out in let pr_c info = (match Ast_c.pinfo_of_info info with Ast_c.AbstractLineTok _ -> @@ -332,14 +353,26 @@ let expand_mcode toks = (!(info.Ast_c.comments_tag)).Ast_c.mafter +> List.iter (fun x -> Common.push2 (comment2t2 x) toks_out) in + let pr_barrier ln col = (* marks a position, used around C code *) + push2 (Cocci2("",ln,col,col)) toks_out in + let pr_nobarrier ln col = () in (* not needed for linux spacing *) + let pr_cspace _ = push2 (C2 " ") toks_out in - let pr_space _ = push2 (C2 " ") toks_out in + let pr_space _ = () (* rely on add_space in cocci code *) in + let pr_arity _ = () (* not interested *) in let indent _ = push2 Indent_cocci2 toks_out in let unindent _ = push2 Unindent_cocci2 toks_out in - let args_pp = (env, pr_cocci, pr_c, pr_space, indent, unindent) in + let args_pp = + (env, pr_cocci, pr_c, pr_cspace, + (match !Flag_parsing_c.spacing with + Flag_parsing_c.SMPL -> pr_space | _ -> pr_cspace), + pr_arity, + (match !Flag_parsing_c.spacing with + Flag_parsing_c.SMPL -> pr_barrier | _ -> pr_nobarrier), + indent, unindent) in (* old: when for yacfe with partial cocci: * add_elem t false; @@ -348,25 +381,25 @@ let expand_mcode toks = (* patch: when need full coccinelle transformation *) let unparser = Unparse_cocci.pp_list_list_any args_pp false in match mcode with - | Ast_cocci.MINUS (_,any_xxs) -> + | Ast_cocci.MINUS (_,inst,adj,any_xxs) -> (* Why adding ? because I want to have all the information, the whole * set of tokens, so I can then process and remove the * is_between_two_minus for instance *) - add_elem t true; + add_elem t (Min (inst,adj)); unparser any_xxs Unparse_cocci.InPlace | Ast_cocci.CONTEXT (_,any_befaft) -> (match any_befaft with | Ast_cocci.NOTHING -> - add_elem t false + add_elem t Ctx | Ast_cocci.BEFORE xxs -> unparser xxs Unparse_cocci.Before; - add_elem t false + add_elem t Ctx | Ast_cocci.AFTER xxs -> - add_elem t false; + add_elem t Ctx; unparser xxs Unparse_cocci.After; | Ast_cocci.BEFOREAFTER (xxs, yys) -> unparser xxs Unparse_cocci.Before; - add_elem t false; + add_elem t Ctx; unparser yys Unparse_cocci.After; ) | Ast_cocci.PLUS -> raise Impossible @@ -408,8 +441,8 @@ let all_coccis = function (*previously gave up if the first character was a newline, but not clear why*) let is_minusable_comment_or_plus x = is_minusable_comment x or all_coccis x -let set_minus_comment = function - | T2 (t,false,idx) -> +let set_minus_comment adj = function + | T2 (t,Ctx,idx) -> let str = TH.str_of_tok t in (match t with | Parser_c.TCommentSpace _ @@ -425,14 +458,14 @@ let set_minus_comment = function (TH.line_of_tok t) str) | _ -> raise Impossible ); - T2 (t, true, idx) + T2 (t, Min adj, idx) (* patch: coccinelle *) - | T2 (Parser_c.TCommentNewline _,true,idx) as x -> x + | T2 (Parser_c.TCommentNewline _,Min adj,idx) as x -> x | _ -> raise Impossible -let set_minus_comment_or_plus = function +let set_minus_comment_or_plus adj = function Cocci2 _ | C2 _ | Indent_cocci2 | Unindent_cocci2 as x -> x - | x -> set_minus_comment x + | x -> set_minus_comment adj x let remove_minus_and_between_and_expanded_and_fake xs = @@ -447,19 +480,20 @@ let remove_minus_and_between_and_expanded_and_fake xs = (*This drops the space before each completely minused block (no plus code).*) let minus_or_comment = function - T2(_,true,_) -> true + T2(_,Min adj,_) -> true | T2(Parser_c.TCommentNewline _,_b,_i) -> false | x -> is_minusable_comment x in let rec adjust_before_minus = function [] -> [] (* patch: coccinelle *) - | (T2(Parser_c.TCommentNewline c,_b,_i) as x)::((T2(_,true,_)::_) as xs) -> + | (T2(Parser_c.TCommentNewline c,_b,_i) as x):: + ((T2(_,Min adj,_)::_) as xs) -> let (between_minus,rest) = Common.span minus_or_comment xs in (match rest with - [] -> (set_minus_comment x) :: between_minus + [] -> (set_minus_comment adj x) :: between_minus | T2(Parser_c.TCommentNewline _,_b,_i)::_ -> - (set_minus_comment x) :: between_minus @ + (set_minus_comment adj x) :: between_minus @ (adjust_before_minus rest) | _ -> x :: between_minus @ (adjust_before_minus rest)) | x::xs -> x::adjust_before_minus xs in @@ -469,7 +503,7 @@ let remove_minus_and_between_and_expanded_and_fake xs = (* this drops blank lines after a brace introduced by removing code *) let rec adjust_after_brace = function [] -> [] - | ((T2(_,false,_)) as x)::((T2(_,true,_)::_) as xs) + | ((T2(_,Ctx,_)) as x)::((T2(_,Min adj,_)::_) as xs) when str_of_token2 x =$= "{" -> let (between_minus,rest) = Common.span minus_or_comment xs in let is_whitespace = function @@ -487,7 +521,7 @@ let remove_minus_and_between_and_expanded_and_fake xs = let (drop_newlines,last_newline) = loop xs in (drop_newlines,x::last_newline) in loop (List.rev newlines) in - x::between_minus@(List.map set_minus_comment drop_newlines)@ + x::between_minus@(List.map (set_minus_comment adj) drop_newlines)@ last_newline@ adjust_after_brace rest | x::xs -> x::adjust_after_brace xs in @@ -499,23 +533,27 @@ let remove_minus_and_between_and_expanded_and_fake xs = (* The use of is_minusable_comment_or_plus and set_minus_comment_or_plus is because the + code can end up anywhere in the middle of the - code; it is not necessarily to the far left *) + + let common_adj (index1,adj1) (index2,adj2) = + adj1 = adj2 (* same adjacency info *) && + (* non-empty intersection of witness trees *) + not ((Common.inter_set index1 index2) = []) in + let rec adjust_between_minus xs = match xs with | [] -> [] - | (T2 (t1,true,idx1))::xs -> - + | ((T2 (_,Min adj1,_)) as t1)::xs -> let (between_comments, rest) = Common.span is_minusable_comment_or_plus xs in (match rest with - | [] -> [(T2 (t1, true,idx1))] + | [] -> [t1] - | (T2 (t2, true,idx2))::rest -> - (T2 (t1, true,idx1)):: - (List.map set_minus_comment_or_plus between_comments @ - adjust_between_minus ((T2 (t2, true, idx2))::rest)) + | ((T2 (_,Min adj2,_)) as t2)::rest when common_adj adj1 adj2 -> + t1:: + (List.map (set_minus_comment_or_plus adj1) between_comments @ + adjust_between_minus (t2::rest)) | x::xs -> - (T2 (t1, true, idx1)):: - (between_comments @ adjust_between_minus (x::xs)) + t1::(between_comments @ adjust_between_minus (x::xs)) ) | x::xs -> x::adjust_between_minus xs in @@ -523,7 +561,7 @@ let remove_minus_and_between_and_expanded_and_fake xs = let xs = adjust_between_minus xs in let xs = xs +> Common.exclude (function - | T2 (t,true,_) -> true + | T2 (t,Min adj,_) -> true | _ -> false ) in xs @@ -533,12 +571,12 @@ let adjust_before_semicolon toks = let toks = List.rev toks in let rec loop = function [] -> [] - | ((T2(_,false,_)) as x)::xs -> + | ((T2(_,Ctx,_)) as x)::xs -> if List.mem (str_of_token2 x) [";";")";","] then let (spaces, rest) = Common.span is_minusable_comment xs in (match rest with - (T2(_,true,_))::_ | (Cocci2 _)::_ -> + (T2(_,Min _,_))::_ | (Cocci2 _)::_ -> (* only drop spaces if something was actually changed before *) x :: loop rest | _ -> x :: loop xs) @@ -552,6 +590,13 @@ let rec add_space xs = match xs with | [] -> [] | [x] -> [x] + | (Cocci2(sx,lnx,_,rcolx) as x)::((Cocci2(sy,lny,lcoly,_)) as y)::xs + when !Flag_parsing_c.spacing = Flag_parsing_c.SMPL && + not (lnx = -1) && lnx = lny && not (rcolx = -1) && rcolx < lcoly -> + (* this only works within a line. could consider whether + something should be done to add newlines too, rather than + printing them explicitly in unparse_cocci. *) + x::C2 (String.make (lcoly-rcolx) ' ')::add_space (y::xs) | x::y::xs -> let sx = str_of_token2 x in let sy = str_of_token2 y in @@ -628,9 +673,10 @@ let rec adjust_indentation xs = | [] -> [] (* patch: coccinelle *) | ((T2 (tok,_,_)) as x)::(T2 (Parser_c.TCommentNewline s, _, _)):: - (Cocci2 "{")::xs when started && str_of_token2 x =$= ")" -> + ((Cocci2 ("{",_,_,_)) as a)::xs + when started && str_of_token2 x =$= ")" -> (* to be done for if, etc, but not for a function header *) - x::(Cocci2 " {")::(aux started xs) + x::(C2 " ")::a::(aux started xs) | ((T2 (Parser_c.TCommentNewline s, _, _)) as x)::xs -> let old_tabbing = !_current_tabbing in str_of_token2 x +> new_tabbing +> (fun s -> _current_tabbing := s); @@ -647,7 +693,7 @@ let rec adjust_indentation xs = None -> aux started xs | Some (tu,_) -> _current_tabbing := (!_current_tabbing)^tu; - Cocci2 (tu)::aux started xs) + Cocci2 (tu,-1,-1,-1)::aux started xs) | Unindent_cocci2::xs -> (match !tabbing_unit with None -> aux started xs @@ -655,7 +701,7 @@ let rec adjust_indentation xs = _current_tabbing := remtab tu (!_current_tabbing); aux started xs) (* border between existing code and cocci code *) - | ((T2 (tok,_,_)) as x)::((Cocci2 "\n") as y)::xs + | ((T2 (tok,_,_)) as x)::((Cocci2("\n",_,_,_)) as y)::xs when str_of_token2 x =$= "{" -> x::aux true (y::Indent_cocci2::xs) | ((Cocci2 _) as x)::((T2 (tok,_,_)) as y)::xs @@ -663,11 +709,11 @@ let rec adjust_indentation xs = x::aux started (y::Unindent_cocci2::xs) (* starting the body of the function *) | ((T2 (tok,_,_)) as x)::xs when str_of_token2 x =$= "{" -> x::aux true xs - | (Cocci2 "{")::xs -> (Cocci2 "{")::aux true xs - | ((Cocci2 "\n") as x)::xs -> + | ((Cocci2("{",_,_,_)) as a)::xs -> a::aux true xs + | ((Cocci2("\n",_,_,_)) as x)::xs -> (* dont inline in expr because of weird eval order of ocaml *) let s = !_current_tabbing in - x::Cocci2 (s)::aux started xs + x::Cocci2 (s,-1,-1,-1)::aux started xs | x::xs -> x::aux started xs in aux false xs diff --git a/parsing_c/unparse_cocci.ml b/parsing_c/unparse_cocci.ml index 89d25d4..9328523 100644 --- a/parsing_c/unparse_cocci.ml +++ b/parsing_c/unparse_cocci.ml @@ -19,14 +19,20 @@ exception CantBeInPlus type pos = Before | After | InPlace -let rec pp_list_list_any (env, pr, pr_elem, pr_space, indent, unindent) +let unknown = -1 + +let rec pp_list_list_any + (env, pr, pr_celem, pr_cspace, pr_space, pr_arity, pr_barrier, + indent, unindent) generating xxs before = (* Just to be able to copy paste the code from pretty_print_cocci.ml. *) -let print_string = pr in +let print_string s line lcol = + let rcol = if lcol = unknown then unknown else lcol + (String.length s) in + pr s line lcol rcol in +let print_text s = pr s unknown unknown unknown in let close_box _ = () in -let print_space() = pr " " in -let force_newline () = pr "\n" in +let force_newline () = print_text "\n" in let start_block () = force_newline(); indent() in let end_block () = unindent(); force_newline () in @@ -38,7 +44,7 @@ let print_between = Common.print_between in let outdent _ = () (* should go to leftmost col, does nothing now *) in let pretty_print_c = - Pretty_print_c.pretty_print_c pr_elem pr_space + Pretty_print_c.pretty_print_c pr_celem pr_cspace force_newline indent outdent unindent in (* --------------------------------------------------------------------- *) @@ -68,7 +74,7 @@ and print_anything_list = function Ast.Rule_elemTag(_) | Ast.AssignOpTag(_) | Ast.BinaryOpTag(_) | Ast.ArithOpTag(_) | Ast.LogicalOpTag(_) | Ast.Token("{",_) -> true | _ -> false) in - if space then print_string " "; + if space then pr_space (); print_anything_list rest in let print_around printer term = function @@ -79,25 +85,29 @@ let print_around printer term = function print_anything bef; printer term; print_anything aft in let print_string_befaft fn fn1 x info = - List.iter (function (s,_,_) -> fn1(); print_string s; force_newline()) + List.iter + (function (s,ln,col) -> fn1(); print_string s ln col; force_newline()) info.Ast.strbef; fn x; - List.iter (function (s,_,_) -> force_newline(); fn1(); print_string s) + List.iter + (function (s,ln,col) -> force_newline(); fn1(); print_string s ln col) info.Ast.straft in -let print_meta (r,x) = print_string x in +let print_meta (r,x) = print_text x in let print_pos = function Ast.MetaPos(name,_,_,_,_) -> let name = Ast.unwrap_mcode name in - print_string "@"; print_meta name + print_text "@"; print_meta name | _ -> () in (* --------------------------------------------------------------------- *) -let mcode fn arg = - match (generating,arg) with - (false,(s,info,_,_)) -> +let mcode fn (s,info,mc,pos) = + let line = info.Ast.line in + let lcol = info.Ast.column in + match (generating,mc) with + (false,_) -> (* printing for transformation *) (* Here we don't care about the annotation on s. *) let print_comments lb comments = @@ -105,48 +115,60 @@ let mcode fn arg = (function line_before -> function (str,line,col) -> match line_before with - None -> print_string str; Some line - | Some lb when line =|= lb -> print_string str; Some line - | _ -> print_string "\n"; print_string str; Some line) + None -> print_string str line col; Some line + | Some lb when line =|= lb -> + print_string str line col; Some line + | _ -> force_newline(); print_string str line col; Some line) lb comments in let line_before = print_comments None info.Ast.strbef in (match line_before with None -> () | Some lb when lb =|= info.Ast.line -> () - | _ -> print_string "\n"); - fn s; + | _ -> force_newline()); + fn s line lcol; let _ = print_comments (Some info.Ast.line) info.Ast.straft in () (* printing for rule generation *) - | (true, (x, _, Ast.MINUS(_,plus_stream), pos)) -> - print_string "\n- "; - fn x; print_pos pos; + | (true, Ast.MINUS(_,_,_,plus_stream)) -> + force_newline(); + print_text "- "; + fn s line lcol; print_pos pos; print_anything plus_stream - | (true, (x, _, Ast.CONTEXT(_,plus_streams), pos)) -> - let fn x = print_string "\n "; fn x; print_pos pos in - print_around fn x plus_streams - | (true,( x, info, Ast.PLUS, pos)) -> - let fn x = print_string "\n+ "; fn x; print_pos pos in - print_string_befaft fn (function _ -> print_string "+ ") x info + | (true, Ast.CONTEXT(_,plus_streams)) -> + let fn s = force_newline(); fn s line lcol; print_pos pos in + print_around fn s plus_streams + | (true,Ast.PLUS) -> + let fn s = + force_newline(); print_text "+ "; fn s line lcol; print_pos pos in + print_string_befaft fn (function _ -> print_text "+ ") s info in (* --------------------------------------------------------------------- *) let handle_metavar name fn = - match (Common.optionise (fun () -> List.assoc (term name) env)) with - | None -> + let ((_,b) as s,info,mc,pos) = name in + let line = info.Ast.line in + let lcol = info.Ast.column in + match Common.optionise (fun () -> List.assoc s env) with + None -> let name_string (_,s) = s in if generating - then mcode (function _ -> pr (name_string (term name))) name + then + mcode (function _ -> print_string (name_string s)) name else failwith (Printf.sprintf "SP line %d: Not found a value in env for: %s" - (Ast_cocci.get_mcode_line name) (name_string (term name))) + line (name_string s)) | Some e -> - if generating - then mcode (function _ -> fn e) name - else fn e + pr_barrier line lcol; + (if generating + then + (* call mcode to preserve the -+ annotation *) + mcode (fun _ _ _ -> fn e) name + else fn e); + let rcol = if lcol = unknown then unknown else lcol + (String.length b) in + pr_barrier line rcol in (* --------------------------------------------------------------------- *) let dots between fn d = @@ -161,17 +183,17 @@ let nest_dots multi fn f d = let mc s = if multi then s^"+>" else s^">" in match Ast.unwrap d with Ast.DOTS(l) -> - print_string (mo "..."); f(); start_block(); + print_text (mo "..."); f(); start_block(); print_between force_newline fn l; - end_block(); print_string (mc "...") + end_block(); print_text (mc "...") | Ast.CIRCLES(l) -> - print_string (mo "ooo"); f(); start_block(); + print_text (mo "ooo"); f(); start_block(); print_between force_newline fn l; - end_block(); print_string (mc "ooo") + end_block(); print_text (mc "ooo") | Ast.STARS(l) -> - print_string (mo "***"); f(); start_block(); + print_text (mo "***"); f(); start_block(); print_between force_newline fn l; - end_block(); print_string (mc "***") + end_block(); print_text (mc "***") in (* --------------------------------------------------------------------- *) @@ -182,17 +204,17 @@ let rec ident i = Ast.Id(name) -> mcode print_string name | Ast.MetaId(name,_,_,_) -> handle_metavar name (function - | (Ast_c.MetaIdVal id) -> pr id + | (Ast_c.MetaIdVal id) -> print_text id | _ -> raise Impossible ) | Ast.MetaFunc(name,_,_,_) -> handle_metavar name (function - | (Ast_c.MetaFuncVal id) -> pr id + | (Ast_c.MetaFuncVal id) -> print_text id | _ -> raise Impossible ) | Ast.MetaLocalFunc(name,_,_,_) -> handle_metavar name (function - | (Ast_c.MetaLocalFuncVal id) -> pr id + | (Ast_c.MetaLocalFuncVal id) -> print_text id | _ -> raise Impossible ) @@ -205,34 +227,30 @@ in (* Expression *) let print_disj_list fn l = - force_newline(); print_string "("; force_newline(); - print_between - (function _ -> - force_newline(); print_string "|"; force_newline()) - fn l; - force_newline(); print_string ")"; force_newline() in + print_text "\n(\n"; + print_between (function _ -> print_text "\n|\n") fn l; + print_text "\n)\n" in let rec expression e = match Ast.unwrap e with Ast.Ident(id) -> ident id - | Ast.Constant(const) -> mcode constant const | Ast.FunCall(fn,lp,args,rp) -> expression fn; mcode print_string_box lp; dots (function _ -> ()) expression args; close_box(); mcode print_string rp | Ast.Assignment(left,op,right,_) -> - expression left; print_string " "; mcode assignOp op; - print_string " "; expression right + expression left; pr_space(); mcode assignOp op; + pr_space(); expression right | Ast.CondExpr(exp1,why,exp2,colon,exp3) -> - expression exp1; print_string " "; mcode print_string why; - print_option (function e -> print_string " "; expression e) exp2; - print_string " "; mcode print_string colon; expression exp3 + expression exp1; pr_space(); mcode print_string why; + print_option (function e -> pr_space(); expression e) exp2; + pr_space(); mcode print_string colon; expression exp3 | Ast.Postfix(exp,op) -> expression exp; mcode fixOp op | Ast.Infix(exp,op) -> mcode fixOp op; expression exp | Ast.Unary(exp,op) -> mcode unaryOp op; expression exp | Ast.Binary(left,op,right) -> - expression left; print_string " "; mcode binaryOp op; print_string " "; + expression left; pr_space(); mcode binaryOp op; pr_space(); expression right | Ast.Nested(left,op,right) -> failwith "nested only in minus code" | Ast.Paren(lp,exp,rp) -> @@ -273,7 +291,7 @@ let rec expression e = | _ -> raise Impossible ) - | Ast.EComma(cm) -> mcode print_string cm; print_space() + | Ast.EComma(cm) -> mcode print_string cm; pr_space() | Ast.DisjExpr(exp_list) -> if generating @@ -281,7 +299,7 @@ let rec expression e = else raise CantBeInPlus | Ast.NestExpr(expr_dots,Some whencode,multi) when generating -> nest_dots multi expression - (function _ -> print_string " when != "; expression whencode) + (function _ -> print_text " when != "; expression whencode) expr_dots | Ast.NestExpr(expr_dots,None,multi) when generating -> nest_dots multi expression (function _ -> ()) expr_dots @@ -292,7 +310,7 @@ let rec expression e = if generating then (mcode print_string dots; - print_string " when != "; + print_text " when != "; expression whencode) else raise CantBeInPlus | Ast.Edots(dots,None) @@ -315,7 +333,9 @@ and unaryOp = function and assignOp = function Ast.SimpleAssign -> print_string "=" - | Ast.OpAssign(aop) -> arithOp aop; print_string "=" + | Ast.OpAssign(aop) -> + (function line -> function lcol -> + arithOp aop line lcol; print_string "=" line lcol) and fixOp = function Ast.Dec -> print_string "--" @@ -348,7 +368,7 @@ and logicalOp = function | Ast.OrLog -> print_string "||" and constant = function - Ast.String(s) -> print_string "\""; print_string s; print_string "\"" + Ast.String(s) -> print_string ("\""^s^"\"") | Ast.Char(s) -> print_string s | Ast.Int(s) -> print_string s | Ast.Float(s) -> print_string s @@ -390,13 +410,13 @@ and typeC ty = | Ast.Array(ty,lb,size,rb) -> fullType ty; mcode print_string lb; print_option expression size; mcode print_string rb - | Ast.EnumName(kind,name) -> mcode print_string kind; print_string " "; + | Ast.EnumName(kind,name) -> mcode print_string kind; pr_space(); ident name | Ast.StructUnionName(kind,name) -> mcode structUnion kind; print_option ident name | Ast.StructUnionDef(ty,lb,decls,rb) -> - fullType ty; + fullType ty; ft_space ty; mcode print_string lb; dots force_newline declaration decls; mcode print_string rb @@ -452,10 +472,10 @@ and print_named_type ty id = (match Ast.unwrap ty1 with Ast.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2) -> print_function_pointer (ty,lp1,star,rp1,lp2,params,rp2) - (function _ -> print_string " "; ident id) + (function _ -> pr_space(); ident id) | Ast.FunctionType(am,ty,lp1,params,rp1) -> print_function_type (ty,lp1,params,rp1) - (function _ -> print_string " "; ident id) + (function _ -> pr_space(); ident id) | Ast.Array(_,_,_,_) -> let rec loop ty k = match Ast.unwrap ty with @@ -480,23 +500,23 @@ and print_named_type ty id = and ty_space ty = match Ast.unwrap ty with Ast.Pointer(_,_) -> () - | _ -> print_space() + | _ -> pr_space() and ft_space ty = match Ast.unwrap ty with Ast.Type(cv,ty) -> (match Ast.unwrap ty with Ast.Pointer(_,_) -> () - | _ -> print_space()) - | _ -> print_space() + | _ -> pr_space()) + | _ -> pr_space() and declaration d = match Ast.unwrap d with Ast.Init(stg,ty,id,eq,ini,sem) -> print_option (mcode storage) stg; print_named_type ty id; - print_string " "; mcode print_string eq; - print_string " "; initialiser true ini; mcode print_string sem + pr_space(); mcode print_string eq; + pr_space(); initialiser true ini; mcode print_string sem | Ast.UnInit(stg,ty,id,sem) -> print_option (mcode storage) stg; print_named_type ty id; @@ -537,8 +557,8 @@ and initialiser nlcomma i = end_block(); mcode print_string rb | Ast.InitList(lb,initlist,rb,_) -> failwith "unexpected whencode in plus" | Ast.InitGccExt(designators,eq,ini) -> - List.iter designator designators; print_string " "; - mcode print_string eq; print_string " "; initialiser nlcomma ini + List.iter designator designators; pr_space(); + mcode print_string eq; pr_space(); initialiser nlcomma ini | Ast.InitGccName(name,eq,ini) -> ident name; mcode print_string eq; initialiser nlcomma ini | Ast.IComma(comma) -> @@ -569,7 +589,7 @@ and parameterTypeDef p = | Ast.MetaParamList(name,_,_,_) -> failwith "not handling MetaParamList" - | Ast.PComma(cm) -> mcode print_string cm; print_space() + | Ast.PComma(cm) -> mcode print_string cm; pr_space() | Ast.Pdots(dots) | Ast.Pcircles(dots) when generating -> mcode print_string dots | Ast.Pdots(dots) | Ast.Pcircles(dots) -> raise CantBeInPlus @@ -584,17 +604,13 @@ in let rec inc_file = function Ast.Local(elems) -> - print_string "\""; - print_between (function _ -> print_string "/") inc_elem elems; - print_string "\"" + print_string ("\""^(String.concat "/" (List.map inc_elem elems))^"\"") | Ast.NonLocal(elems) -> - print_string "<"; - print_between (function _ -> print_string "/") inc_elem elems; - print_string ">" + print_string ("<"^(String.concat "/" (List.map inc_elem elems))^">") and inc_elem = function - Ast.IncPath s -> print_string s - | Ast.IncDots -> print_string "..." + Ast.IncPath s -> s + | Ast.IncDots -> "..." (* --------------------------------------------------------------------- *) (* Top-level code *) @@ -602,94 +618,91 @@ and inc_elem = function and rule_elem arity re = match Ast.unwrap re with Ast.FunHeader(_,_,fninfo,name,lp,params,rp) -> - print_string arity; List.iter print_fninfo fninfo; + pr_arity arity; List.iter print_fninfo fninfo; ident name; mcode print_string_box lp; parameter_list params; close_box(); mcode print_string rp; - print_string " " - | Ast.Decl(_,_,decl) -> print_string arity; declaration decl + pr_space() + | Ast.Decl(_,_,decl) -> pr_arity arity; declaration decl | Ast.SeqStart(brace) -> - print_string arity; mcode print_string brace; start_block() + pr_arity arity; mcode print_string brace; start_block() | Ast.SeqEnd(brace) -> - end_block(); print_string arity; mcode print_string brace + end_block(); pr_arity arity; mcode print_string brace | Ast.ExprStatement(exp,sem) -> - print_string arity; expression exp; mcode print_string sem + pr_arity arity; expression exp; mcode print_string sem | Ast.IfHeader(iff,lp,exp,rp) -> - print_string arity; - mcode print_string iff; print_string " "; mcode print_string_box lp; + pr_arity arity; + mcode print_string iff; pr_space(); mcode print_string_box lp; expression exp; close_box(); mcode print_string rp | Ast.Else(els) -> - print_string arity; mcode print_string els + pr_arity arity; mcode print_string els | Ast.WhileHeader(whl,lp,exp,rp) -> - print_string arity; - mcode print_string whl; print_string " "; mcode print_string_box lp; + pr_arity arity; + mcode print_string whl; pr_space(); mcode print_string_box lp; expression exp; close_box(); mcode print_string rp | Ast.DoHeader(d) -> - print_string arity; mcode print_string d + pr_arity arity; mcode print_string d | Ast.WhileTail(whl,lp,exp,rp,sem) -> - print_string arity; - mcode print_string whl; print_string " "; mcode print_string_box lp; + pr_arity arity; + mcode print_string whl; pr_space(); mcode print_string_box lp; expression exp; close_box(); mcode print_string rp; mcode print_string sem | Ast.ForHeader(fr,lp,e1,sem1,e2,sem2,e3,rp) -> - print_string arity; + pr_arity arity; mcode print_string fr; mcode print_string_box lp; print_option expression e1; mcode print_string sem1; print_option expression e2; mcode print_string sem2; print_option expression e3; close_box(); mcode print_string rp | Ast.IteratorHeader(nm,lp,args,rp) -> - print_string arity; - ident nm; print_string " "; mcode print_string_box lp; + pr_arity arity; + ident nm; pr_space(); mcode print_string_box lp; dots (function _ -> ()) expression args; close_box(); mcode print_string rp | Ast.SwitchHeader(switch,lp,exp,rp) -> - print_string arity; - mcode print_string switch; print_string " "; mcode print_string_box lp; + pr_arity arity; + mcode print_string switch; pr_space(); mcode print_string_box lp; expression exp; close_box(); mcode print_string rp | Ast.Break(br,sem) -> - print_string arity; mcode print_string br; mcode print_string sem + pr_arity arity; mcode print_string br; mcode print_string sem | Ast.Continue(cont,sem) -> - print_string arity; mcode print_string cont; mcode print_string sem + pr_arity arity; mcode print_string cont; mcode print_string sem | Ast.Label(l,dd) -> ident l; mcode print_string dd | Ast.Goto(goto,l,sem) -> mcode print_string goto; ident l; mcode print_string sem | Ast.Return(ret,sem) -> - print_string arity; mcode print_string ret; + pr_arity arity; mcode print_string ret; mcode print_string sem | Ast.ReturnExpr(ret,exp,sem) -> - print_string arity; mcode print_string ret; print_string " "; + pr_arity arity; mcode print_string ret; pr_space(); expression exp; mcode print_string sem - | Ast.Exp(exp) -> print_string arity; expression exp - | Ast.TopExp(exp) -> print_string arity; expression exp - | Ast.Ty(ty) -> print_string arity; fullType ty + | Ast.Exp(exp) -> pr_arity arity; expression exp + | Ast.TopExp(exp) -> pr_arity arity; expression exp + | Ast.Ty(ty) -> pr_arity arity; fullType ty | Ast.TopInit(init) -> initialiser false init | Ast.Include(inc,s) -> - mcode print_string inc; print_string " "; mcode inc_file s + mcode print_string inc; print_text " "; mcode inc_file s | Ast.DefineHeader(def,id,params) -> - mcode print_string def; print_string " "; ident id; + mcode print_string def; pr_space(); ident id; print_define_parameters params | Ast.Default(def,colon) -> - mcode print_string def; mcode print_string colon; print_string " " + mcode print_string def; mcode print_string colon; pr_space() | Ast.Case(case,exp,colon) -> - mcode print_string case; print_string " "; expression exp; - mcode print_string colon; print_string " " + mcode print_string case; pr_space(); expression exp; + mcode print_string colon; pr_space() | Ast.DisjRuleElem(res) -> if generating then - (print_string arity; - force_newline(); print_string "("; force_newline(); - print_between - (function _ -> force_newline(); print_string "|"; force_newline()) - (rule_elem arity) + (pr_arity arity; print_text "\n(\n"; + print_between (function _ -> print_text "\n|\n") (rule_elem arity) res; - force_newline(); print_string ")") + print_text "\n)") else raise CantBeInPlus | Ast.MetaRuleElem(name,_,_) -> @@ -718,27 +731,26 @@ and print_define_param param = | Ast.DPComma(comma) -> mcode print_string comma | Ast.DPdots(dots) -> mcode print_string dots | Ast.DPcircles(circles) -> mcode print_string circles - | Ast.OptDParam(dp) -> print_string "?"; print_define_param dp - | Ast.UniqueDParam(dp) -> print_string "!"; print_define_param dp + | Ast.OptDParam(dp) -> print_text "?"; print_define_param dp + | Ast.UniqueDParam(dp) -> print_text "!"; print_define_param dp and print_fninfo = function Ast.FStorage(stg) -> mcode storage stg | Ast.FType(ty) -> fullType ty - | Ast.FInline(inline) -> mcode print_string inline; print_string " " - | Ast.FAttr(attr) -> mcode print_string attr; print_string " " in + | Ast.FInline(inline) -> mcode print_string inline; pr_space() + | Ast.FAttr(attr) -> mcode print_string attr; pr_space() in let indent_if_needed s f = match Ast.unwrap s with - Ast.Seq(lbrace,decls,body,rbrace) -> pr_space(); f() + Ast.Seq(lbrace,body,rbrace) -> pr_space(); f() | _ -> (*no newline at the end - someone else will do that*) start_block(); f(); unindent() in let rec statement arity s = match Ast.unwrap s with - Ast.Seq(lbrace,decls,body,rbrace) -> + Ast.Seq(lbrace,body,rbrace) -> rule_elem arity lbrace; - dots force_newline (statement arity) decls; dots force_newline (statement arity) body; rule_elem arity rbrace @@ -748,10 +760,9 @@ let rec statement arity s = | Ast.IfThenElse(header,branch1,els,branch2,_) -> rule_elem arity header; indent_if_needed branch1 (function _ -> statement arity branch1); - print_string " "; + force_newline(); rule_elem arity els; indent_if_needed branch2 (function _ -> statement arity branch2) - | Ast.While(header,body,_) -> rule_elem arity header; indent_if_needed body (function _ -> statement arity body) @@ -765,43 +776,40 @@ let rec statement arity s = | Ast.Iterator(header,body,(_,_,_,aft)) -> rule_elem arity header; indent_if_needed body (function _ -> statement arity body); - mcode (function _ -> ()) ((),Ast.no_info,aft,Ast.NoMetaPos) + mcode (fun _ _ _ -> ()) ((),Ast.no_info,aft,Ast.NoMetaPos) | Ast.Switch(header,lb,cases,rb) -> - rule_elem arity header; print_string " "; rule_elem arity lb; + rule_elem arity header; pr_space(); rule_elem arity lb; List.iter (function x -> case_line arity x; force_newline()) cases; rule_elem arity rb | Ast.Atomic(re) -> rule_elem arity re - | Ast.FunDecl(header,lbrace,decls,body,rbrace) -> + | Ast.FunDecl(header,lbrace,body,rbrace) -> rule_elem arity header; rule_elem arity lbrace; - dots force_newline (statement arity) decls; dots force_newline (statement arity) body; rule_elem arity rbrace | Ast.Define(header,body) -> - rule_elem arity header; print_string " "; + rule_elem arity header; pr_space(); dots force_newline (statement arity) body | Ast.Disj([stmt_dots]) -> if generating then - (print_string arity; + (pr_arity arity; dots force_newline (statement arity) stmt_dots) else raise CantBeInPlus | Ast.Disj(stmt_dots_list) -> (* ignores newline directive for readability *) if generating then - (print_string arity; - force_newline(); print_string "("; force_newline(); - print_between - (function _ -> force_newline();print_string "|"; force_newline()) + (pr_arity arity; print_text "\n(\n"; + print_between (function _ -> print_text "\n|\n") (dots force_newline (statement arity)) stmt_dots_list; - force_newline(); print_string ")") + print_text "\n)") else raise CantBeInPlus | Ast.Nest(stmt_dots,whn,multi,_,_) when generating -> - print_string arity; + pr_arity arity; nest_dots multi (statement arity) (function _ -> print_between force_newline @@ -812,7 +820,7 @@ let rec statement arity s = | Ast.Dots(d,whn,_,_) | Ast.Circles(d,whn,_,_) | Ast.Stars(d,whn,_,_) -> if generating then - (print_string arity; mcode print_string d; + (pr_arity arity; mcode print_string d; print_between force_newline (whencode (dots force_newline (statement "")) (statement "")) whn; force_newline()) @@ -823,25 +831,25 @@ let rec statement arity s = and whencode notfn alwaysfn = function Ast.WhenNot a -> - print_string " WHEN != "; notfn a + print_text " WHEN != "; notfn a | Ast.WhenAlways a -> - print_string " WHEN = "; alwaysfn a - | Ast.WhenModifier x -> print_string " WHEN "; print_when_modif x + print_text " WHEN = "; alwaysfn a + | Ast.WhenModifier x -> print_text " WHEN "; print_when_modif x | Ast.WhenNotTrue a -> - print_string " WHEN != TRUE "; rule_elem "" a + print_text " WHEN != TRUE "; rule_elem "" a | Ast.WhenNotFalse a -> - print_string " WHEN != FALSE "; rule_elem "" a + print_text " WHEN != FALSE "; rule_elem "" a and print_when_modif = function - | Ast.WhenAny -> print_string "ANY" - | Ast.WhenStrict -> print_string "STRICT" - | Ast.WhenForall -> print_string "FORALL" - | Ast.WhenExists -> print_string "EXISTS" + | Ast.WhenAny -> print_text "ANY" + | Ast.WhenStrict -> print_text "STRICT" + | Ast.WhenForall -> print_text "FORALL" + | Ast.WhenExists -> print_text "EXISTS" and case_line arity c = match Ast.unwrap c with Ast.CaseLine(header,code) -> - rule_elem arity header; print_string " "; + rule_elem arity header; pr_space(); dots force_newline (statement arity) code | Ast.OptCase(case) -> raise CantBeInPlus in @@ -865,45 +873,44 @@ let if_open_brace = function "{" -> true | _ -> false in let rec pp_any = function (* assert: normally there is only CONTEXT NOTHING tokens in any *) Ast.FullTypeTag(x) -> fullType x; false - | Ast.BaseTypeTag(x) -> baseType x; false - | Ast.StructUnionTag(x) -> structUnion x; false - | Ast.SignTag(x) -> sign x; false + | Ast.BaseTypeTag(x) -> baseType x unknown unknown; false + | Ast.StructUnionTag(x) -> structUnion x unknown unknown; false + | Ast.SignTag(x) -> sign x unknown unknown; false | Ast.IdentTag(x) -> ident x; false | Ast.ExpressionTag(x) -> expression x; false - | Ast.ConstantTag(x) -> constant x; false - | Ast.UnaryOpTag(x) -> unaryOp x; false - | Ast.AssignOpTag(x) -> assignOp x; false - | Ast.FixOpTag(x) -> fixOp x; false - | Ast.BinaryOpTag(x) -> binaryOp x; false - | Ast.ArithOpTag(x) -> arithOp x; false - | Ast.LogicalOpTag(x) -> logicalOp x; false + | Ast.ConstantTag(x) -> constant x unknown unknown; false + | Ast.UnaryOpTag(x) -> unaryOp x unknown unknown; false + | Ast.AssignOpTag(x) -> assignOp x unknown unknown; false + | Ast.FixOpTag(x) -> fixOp x unknown unknown; false + | Ast.BinaryOpTag(x) -> binaryOp x unknown unknown; false + | Ast.ArithOpTag(x) -> arithOp x unknown unknown; false + | Ast.LogicalOpTag(x) -> logicalOp x unknown unknown; false | Ast.InitTag(x) -> initialiser false x; false | Ast.DeclarationTag(x) -> declaration x; false - | Ast.StorageTag(x) -> storage x; false - | Ast.IncFileTag(x) -> inc_file x; false + | Ast.StorageTag(x) -> storage x unknown unknown; false + | Ast.IncFileTag(x) -> inc_file x unknown unknown; false | Ast.Rule_elemTag(x) -> rule_elem "" x; false | Ast.StatementTag(x) -> statement "" x; false | Ast.CaseLineTag(x) -> case_line "" x; false - | Ast.ConstVolTag(x) -> const_vol x; false - | Ast.Pragma(xs) -> print_between force_newline print_string xs; false - | Ast.Token(x,None) -> print_string x; if_open_brace x + | Ast.ConstVolTag(x) -> const_vol x unknown unknown; false + | Ast.Pragma(xs) -> print_between force_newline print_text xs; false + | Ast.Token(x,None) -> print_text x; if_open_brace x | Ast.Token(x,Some info) -> mcode - (function x -> + (fun x line lcol -> (match x with - "else" -> pr "\n" + "else" -> force_newline() | _ -> ()); - print_string x; - (* if x ==~ Common.regexp_alpha then print_string " "; *) + print_string x line lcol; (match x with - (*"return" |*) "else" -> print_string " " + "else" -> pr_space() | _ -> ())) (let nomcodekind = Ast.CONTEXT(Ast.DontCarePos,Ast.NOTHING) in (x,info,nomcodekind,Ast.NoMetaPos)); @@ -915,8 +922,8 @@ let rec pp_any = function normally there should be no '...' inside them *) | Ast.ExprDotsTag(x) -> dots (function _ -> ()) expression x; false | Ast.ParamDotsTag(x) -> parameter_list x; false - | Ast.StmtDotsTag(x) -> dots (function _ -> pr "\n") (statement "") x; false - | Ast.DeclDotsTag(x) -> dots (function _ -> pr "\n") declaration x; false + | Ast.StmtDotsTag(x) -> dots force_newline (statement "") x; false + | Ast.DeclDotsTag(x) -> dots force_newline declaration x; false | Ast.TypeCTag(x) -> typeC x; false | Ast.ParamTag(x) -> parameterTypeDef x; false @@ -939,13 +946,14 @@ in | _ -> false in let prnl x = (if unindent_before x then unindent()); - pr "\n" in + force_newline() in let newline_before _ = if before =*= After then let hd = List.hd xxs in match hd with - (Ast.StatementTag s::_) when isfn s -> pr "\n\n" + (Ast.StatementTag s::_) when isfn s -> + force_newline(); force_newline() | (Ast.Pragma _::_) | (Ast.Rule_elemTag _::_) | (Ast.StatementTag _::_) | (Ast.InitTag _::_) @@ -956,10 +964,12 @@ in then match List.rev(List.hd(List.rev xxs)) with (Ast.StatementTag s::_) -> - if isfn s then pr "\n\n" else pr "\n" + (if isfn s then force_newline()); + force_newline() | (Ast.Pragma _::_) | (Ast.Rule_elemTag _::_) | (Ast.InitTag _::_) - | (Ast.DeclarationTag _::_) | (Ast.Token ("{",_)::_) -> pr "\n" + | (Ast.DeclarationTag _::_) | (Ast.Token ("{",_)::_) -> + force_newline() | _ -> () in (* print a newline at the beginning, if needed *) newline_before(); @@ -970,10 +980,10 @@ in (if leading_newline then match (indent_needed,unindent_before x) with - (true,true) -> pr "\n" - | (true,false) -> pr "\n"; indent() - | (false,true) -> unindent(); pr "\n" - | (false,false) -> pr "\n"); + (true,true) -> force_newline() + | (true,false) -> force_newline(); indent() + | (false,true) -> unindent(); force_newline() + | (false,false) -> force_newline()); let indent_needed = List.fold_left (function indent_needed -> pp_any) false x in loop true indent_needed xs in diff --git a/parsing_c/unparse_cocci.mli b/parsing_c/unparse_cocci.mli index 9500a99..f2544b7 100644 --- a/parsing_c/unparse_cocci.mli +++ b/parsing_c/unparse_cocci.mli @@ -3,9 +3,14 @@ exception CantBeInPlus type pos = Before | After | InPlace val pp_list_list_any : - Ast_c.metavars_binding * - (string -> unit) (* pr cocci *) * Pretty_print_c.pr_elem_func (* pr c *) * + Ast_c.metavars_binding * + (* pr cocci *) + (string -> int (*line*) -> int (*lcol*) -> int (*rcol*) -> unit) * + Pretty_print_c.pr_elem_func (* pr c *) * + (unit -> unit) (* pr C space *) * (unit -> unit) (* pr space *) * + (string -> unit) (* pr arity *) * + (int (*line*) -> int (*lcol*) -> unit) (* pr barrier *) * (unit -> unit) (* indent *) * (unit -> unit) (* unindent *) -> bool (*true if generating*) -> Ast_cocci.anything list list -> pos -> unit diff --git a/parsing_c/unparse_hrule.ml b/parsing_c/unparse_hrule.ml index 21fd4b7..54cbec1 100644 --- a/parsing_c/unparse_hrule.ml +++ b/parsing_c/unparse_hrule.ml @@ -77,7 +77,7 @@ let get_function_name rule env = [] any_list_list in let mcode r mc = match Ast.get_mcodekind mc with - Ast.MINUS(_,any_list_list) -> do_any_list_list r any_list_list + Ast.MINUS(_,_,_,any_list_list) -> do_any_list_list r any_list_list | Ast.CONTEXT(_,any_befaft) -> (match any_befaft with Ast.BEFORE(any_list_list) | Ast.AFTER(any_list_list) -> @@ -457,9 +457,10 @@ let pp_rule local_metas ast env srcfile = | _ -> Printf.printf "line: %s\n" (Common.dump info); error rule "not an abstract line" in + let pr_space _ = pr " " in Unparse_cocci.pp_list_list_any - (env, pr, pr_c, (function _ -> pr " "), - (function _ -> ()), (function _ -> ())) + (env, (fun s _ _ _ -> pr s), pr_c, pr_space, pr_space, pr, + (fun _ _ -> ()), (function _ -> ()), (function _ -> ())) true printable Unparse_cocci.InPlace; print_end pr; pr "\n") diff --git a/parsing_c/visitor_c.ml b/parsing_c/visitor_c.ml index 923b9c4..08ebbe8 100644 --- a/parsing_c/visitor_c.ml +++ b/parsing_c/visitor_c.ml @@ -25,6 +25,11 @@ module F = Control_flow_c * disable_go_type_annotation ? *) +(*****************************************************************************) +(* Wrappers *) +(*****************************************************************************) +let pr2, pr2_once = Common.mk_pr2_wrappers Flag_parsing_c.verbose_visit + (*****************************************************************************) (* Functions to visit the Ast, and now also the CFG nodes *) (*****************************************************************************) @@ -358,7 +363,9 @@ and vk_statement = fun bigf (st: Ast_c.statement) -> let (unwrap_st, ii) = st in iif ii; match unwrap_st with - | Labeled (Label (s, st)) -> statf st; + | Labeled (Label (name, st)) -> + vk_name bigf name; + statf st; | Labeled (Case (e, st)) -> vk_expr bigf e; statf st; | Labeled (CaseRange (e, e2, st)) -> vk_expr bigf e; vk_expr bigf e2; statf st; @@ -376,9 +383,9 @@ and vk_statement = fun bigf (st: Ast_c.statement) -> vk_expr bigf e; statf st; | Iteration (DoWhile (st, e)) -> statf st; vk_expr bigf e; | Iteration (For ((e1opt,i1), (e2opt,i2), (e3opt,i3), st)) -> - statf (ExprStatement (e1opt),i1); - statf (ExprStatement (e2opt),i2); - statf (ExprStatement (e3opt),i3); + statf (mk_st (ExprStatement (e1opt)) i1); + statf (mk_st (ExprStatement (e2opt)) i2); + statf (mk_st (ExprStatement (e3opt)) i3); statf st; | Iteration (MacroIteration (s, es, st)) -> @@ -557,17 +564,15 @@ and vk_struct_field = fun bigf field -> let f = bigf.kfield in let rec k field = - let (xfield, ii) = field in - iif ii; - match xfield with + match field with | DeclarationField (FieldDeclList (onefield_multivars, iiptvirg)) -> vk_struct_fieldkinds bigf onefield_multivars; iif iiptvirg; - | EmptyField -> () - | MacroStructDeclTodo -> - pr2_once "MacroStructDeclTodo"; - () + | EmptyField info -> iif [info] + | MacroDeclField ((s, args),ii) -> + iif ii; + vk_argument_list bigf args; | CppDirectiveStruct directive -> vk_cpp_directive bigf directive @@ -603,7 +608,7 @@ and vk_def = fun bigf d -> let f = bigf.kdef in let rec k d = match d with - | {f_name = s; + | {f_name = name; f_type = (returnt, (paramst, (b, iib))); f_storage = sto; f_body = statxs; @@ -615,6 +620,7 @@ and vk_def = fun bigf d -> iif iib; attrs +> List.iter (vk_attribute bigf); vk_type bigf returnt; + vk_name bigf name; paramst +> List.iter (fun (param,iicomma) -> vk_param bigf param; iif iicomma; @@ -1086,8 +1092,8 @@ and vk_statement_s = fun bigf st -> let (unwrap_st, ii) = st in let st' = match unwrap_st with - | Labeled (Label (s, st)) -> - Labeled (Label (s, statf st)) + | Labeled (Label (name, st)) -> + Labeled (Label (vk_name_s bigf name, statf st)) | Labeled (Case (e, st)) -> Labeled (Case ((vk_expr_s bigf) e , statf st)) | Labeled (CaseRange (e, e2, st)) -> @@ -1108,12 +1114,21 @@ and vk_statement_s = fun bigf st -> | Iteration (DoWhile (st, e)) -> Iteration (DoWhile (statf st, (vk_expr_s bigf) e)) | Iteration (For ((e1opt,i1), (e2opt,i2), (e3opt,i3), st)) -> - let e1opt' = statf (ExprStatement (e1opt),i1) in - let e2opt' = statf (ExprStatement (e2opt),i2) in - let e3opt' = statf (ExprStatement (e3opt),i3) in - (match (e1opt', e2opt', e3opt') with - | ((ExprStatement x1,i1), (ExprStatement x2,i2), ((ExprStatement x3,i3))) -> - Iteration (For ((x1,i1), (x2,i2), (x3,i3), statf st)) + let e1opt' = statf (mk_st (ExprStatement (e1opt)) i1) in + let e2opt' = statf (mk_st (ExprStatement (e2opt)) i2) in + let e3opt' = statf (mk_st (ExprStatement (e3opt)) i3) in + + let e1' = Ast_c.unwrap_st e1opt' in + let e2' = Ast_c.unwrap_st e2opt' in + let e3' = Ast_c.unwrap_st e3opt' in + let i1' = Ast_c.get_ii_st_take_care e1opt' in + let i2' = Ast_c.get_ii_st_take_care e2opt' in + let i3' = Ast_c.get_ii_st_take_care e3opt' in + + (match (e1', e2', e3') with + | ((ExprStatement x1), (ExprStatement x2), ((ExprStatement x3))) -> + Iteration (For ((x1,i1'), (x2,i2'), (x3,i3'), statf st)) + | x -> failwith "cant be here if iterator keep ExprStatement as is" ) @@ -1349,24 +1364,26 @@ and vk_struct_fields_s = fun bigf fields -> let iif ii = vk_ii_s bigf ii in - fields +> List.map (fun (xfield, iiptvirg) -> - - (match xfield with + fields +> List.map (fun (field) -> + (match field with | (DeclarationField (FieldDeclList (onefield_multivars, iiptvirg))) -> DeclarationField (FieldDeclList (vk_struct_fieldkinds_s bigf onefield_multivars, iif iiptvirg)) - | EmptyField -> EmptyField - | MacroStructDeclTodo -> - pr2_once "MacroStructDeclTodo"; - MacroStructDeclTodo + | EmptyField info -> EmptyField (vk_info_s bigf info) + | MacroDeclField ((s, args),ii) -> + MacroDeclField + ((s, + args +> List.map (fun (e,ii) -> vk_argument_s bigf e, iif ii) + ), + iif ii) | CppDirectiveStruct directive -> CppDirectiveStruct (vk_cpp_directive_s bigf directive) | IfdefStruct ifdef -> IfdefStruct (vk_ifdef_directive_s bigf ifdef) - ), iif iiptvirg + ) ) @@ -1375,7 +1392,7 @@ and vk_def_s = fun bigf d -> let iif ii = vk_ii_s bigf ii in let rec k d = match d with - | {f_name = s; + | {f_name = name; f_type = (returnt, (paramst, (b, iib))); f_storage = sto; f_body = statxs; @@ -1383,7 +1400,7 @@ and vk_def_s = fun bigf d -> f_old_c_style = oldstyle; }, ii -> - {f_name = s; + {f_name = vk_name_s bigf name; f_type = (vk_type_s bigf returnt, (paramst +> List.map (fun (param, iicomma) -> diff --git a/parsing_cocci/.depend b/parsing_cocci/.depend index 777990c..d2f80c2 100644 --- a/parsing_cocci/.depend +++ b/parsing_cocci/.depend @@ -1,3 +1,4 @@ +adjacency.cmi: ast0_cocci.cmi adjust_pragmas.cmi: ast0_cocci.cmi arity.cmi: ast0_cocci.cmi ast0_cocci.cmi: type_cocci.cmi ast_cocci.cmi @@ -31,6 +32,10 @@ unitary_ast0.cmi: ast0_cocci.cmi unparse_ast0.cmi: ast0_cocci.cmi visitor_ast.cmi: ast_cocci.cmi visitor_ast0.cmi: visitor_ast0_types.cmo ast_cocci.cmi ast0_cocci.cmi +adjacency.cmo: visitor_ast0_types.cmo visitor_ast0.cmi ast0_cocci.cmi \ + adjacency.cmi +adjacency.cmx: visitor_ast0_types.cmx visitor_ast0.cmx ast0_cocci.cmx \ + adjacency.cmi adjust_pragmas.cmo: visitor_ast0_types.cmo visitor_ast0.cmi ast0_cocci.cmi \ adjust_pragmas.cmi adjust_pragmas.cmx: visitor_ast0_types.cmx visitor_ast0.cmx ast0_cocci.cmx \ @@ -125,7 +130,7 @@ parse_cocci.cmo: visitor_ast0_types.cmo visitor_ast0.cmi unitary_ast0.cmi \ ../globals/flag.cmo disjdistr.cmi data.cmi context_neg.cmi \ compute_lines.cmi ../commons/common.cmi comm_assoc.cmi check_meta.cmi \ ast_cocci.cmi ast0toast.cmi ast0_cocci.cmi arity.cmi adjust_pragmas.cmi \ - parse_cocci.cmi + adjacency.cmi parse_cocci.cmi parse_cocci.cmx: visitor_ast0_types.cmx visitor_ast0.cmx unitary_ast0.cmx \ type_infer.cmx test_exps.cmx single_statement.cmx simple_assignments.cmx \ semantic_cocci.cmx pretty_print_cocci.cmx parse_aux.cmx iso_pattern.cmx \ @@ -134,7 +139,7 @@ parse_cocci.cmx: visitor_ast0_types.cmx visitor_ast0.cmx unitary_ast0.cmx \ ../globals/flag.cmx disjdistr.cmx data.cmx context_neg.cmx \ compute_lines.cmx ../commons/common.cmx comm_assoc.cmx check_meta.cmx \ ast_cocci.cmx ast0toast.cmx ast0_cocci.cmx arity.cmx adjust_pragmas.cmx \ - parse_cocci.cmi + adjacency.cmx parse_cocci.cmi plus.cmo: visitor_ast.cmi ast_cocci.cmi plus.cmi plus.cmx: visitor_ast.cmx ast_cocci.cmx plus.cmi pretty_print_cocci.cmo: type_cocci.cmi ../globals/flag.cmo \ diff --git a/parsing_cocci/Makefile b/parsing_cocci/Makefile index cf02ae3..51a86b4 100644 --- a/parsing_cocci/Makefile +++ b/parsing_cocci/Makefile @@ -35,7 +35,7 @@ adjust_pragmas.ml insert_plus.ml function_prototypes.ml \ unify_ast.ml semantic_cocci.ml data.ml free_vars.ml parse_aux.ml disjdistr.ml \ $(LEXER_SOURCES:.mll=.ml) $(PARSER_SOURCES:.mly=.ml) \ $(SCRIPT_LEXER_SOURCES:.mll=.ml) \ -get_constants.ml get_constants2.ml parse_cocci.ml +get_constants.ml get_constants2.ml adjacency.ml parse_cocci.ml LIBS=../commons/commons.cma ../globals/globals.cma SYSLIBS = str.cma unix.cma @@ -116,7 +116,7 @@ $(PARSER_SOURCES:.mly=.ml) $(PARSER_SOURCES:.mly=.mli) : $(PARSER_SOURCES) $(SCRIPT_LEXER_SOURCES:.mll=.ml): $(SCRIPT_LEXER_SOURCES) $(OCAMLLEX) $(SCRIPT_LEXER_SOURCES) -clean:: +distclean:: rm -f $(GENERATED) # clean rule for others files diff --git a/parsing_cocci/adjacency.ml b/parsing_cocci/adjacency.ml new file mode 100644 index 0000000..211cabb --- /dev/null +++ b/parsing_cocci/adjacency.ml @@ -0,0 +1,32 @@ +module Ast0 = Ast0_cocci +module V0 = Visitor_ast0 +module VT0 = Visitor_ast0_types + +let compute_adjacency p = + let counter = ref 0 in + let mcode (a,b,c,d,e,_) = (a,b,c,d,e,!counter) in + let string_mcode ((str,_,info,mc,_,_) as x) = + match str with + "..." | "<..." | "...>" | "<+..." | "...+>" -> + (match mc with + Ast0.MINUS _ -> mcode x + | Ast0.CONTEXT _ -> counter := !counter + 1; x + | _ -> failwith "unexpected mcode for ...") + | _ -> mcode x in + let fn = + V0.rebuilder + {V0.rebuilder_functions with + VT0.rebuilder_meta_mcode = mcode; + VT0.rebuilder_string_mcode = string_mcode; + VT0.rebuilder_const_mcode = mcode; + VT0.rebuilder_assign_mcode = mcode; + VT0.rebuilder_fix_mcode = mcode; + VT0.rebuilder_unary_mcode = mcode; + VT0.rebuilder_binary_mcode = mcode; + VT0.rebuilder_cv_mcode = mcode; + VT0.rebuilder_sign_mcode = mcode; + VT0.rebuilder_struct_mcode = mcode; + VT0.rebuilder_storage_mcode = mcode; + VT0.rebuilder_inc_mcode = mcode;} in + List.map fn.VT0.rebuilder_rec_top_level p + diff --git a/parsing_cocci/adjacency.mli b/parsing_cocci/adjacency.mli new file mode 100644 index 0000000..f076530 --- /dev/null +++ b/parsing_cocci/adjacency.mli @@ -0,0 +1 @@ +val compute_adjacency : Ast0_cocci.rule -> Ast0_cocci.rule diff --git a/parsing_cocci/adjust_pragmas.ml b/parsing_cocci/adjust_pragmas.ml index 8688e5c..7ea7419 100644 --- a/parsing_cocci/adjust_pragmas.ml +++ b/parsing_cocci/adjust_pragmas.ml @@ -10,15 +10,15 @@ let call_right processor data s cont = None -> None | Some(pragmas,data) -> Some (pragmas,Ast0.rewrap s (cont data)) -let left_mcode (a,b,info,mcodekind,d) = +let left_mcode (a,b,info,mcodekind,d,e) = match (info.Ast0.strings_before,mcodekind) with ([],_) | (_,Ast0.PLUS) -> None - | (l,_) -> Some(l,(a,b,{info with Ast0.strings_before = []},mcodekind,d)) + | (l,_) -> Some(l,(a,b,{info with Ast0.strings_before = []},mcodekind,d,e)) -let right_mcode (a,b,info,mcodekind,d) = +let right_mcode (a,b,info,mcodekind,d,e) = match (info.Ast0.strings_after,mcodekind) with ([],_) | (_,Ast0.PLUS) -> None - | (l,_) -> Some(l,(a,b,{info with Ast0.strings_after = []},mcodekind,d)) + | (l,_) -> Some(l,(a,b,{info with Ast0.strings_after = []},mcodekind,d,e)) let update_before pragmas (info,x) = ({info with Ast0.strings_before = pragmas @ info.Ast0.strings_before}, diff --git a/parsing_cocci/arity.ml b/parsing_cocci/arity.ml index 65863ec..c8da41d 100644 --- a/parsing_cocci/arity.ml +++ b/parsing_cocci/arity.ml @@ -80,8 +80,8 @@ let allopt l fn = (* --------------------------------------------------------------------- *) (* Mcode *) -let mcode2line (_,_,info,_,_) = info.Ast0.pos_info.Ast0.line_start -let mcode2arity (_,arity,_,_,_) = arity +let mcode2line (_,_,info,_,_,_) = info.Ast0.pos_info.Ast0.line_start +let mcode2arity (_,arity,_,_,_,_) = arity let mcode x = x (* nothing to do ... *) diff --git a/parsing_cocci/ast0_cocci.ml b/parsing_cocci/ast0_cocci.ml index cee3396..4256525 100644 --- a/parsing_cocci/ast0_cocci.ml +++ b/parsing_cocci/ast0_cocci.ml @@ -52,7 +52,12 @@ type info = { pos_info : position_info; strings_before : (string * position_info) list; strings_after : (string * position_info) list } -type 'a mcode = 'a * arity * info * mcodekind * meta_pos ref (* pos, - only *) +(* adjacency index is incremented when we skip over dots or nest delimiters +it is used in deciding how much to remove, when two adjacent code tokens are +removed. *) +type 'a mcode = + 'a * arity * info * mcodekind * meta_pos ref (* pos, - only *) * + int (* adjacency_index *) (* int ref is an index *) and 'a wrap = { node : 'a; @@ -470,15 +475,17 @@ let context_wrap x = true_if_test_exp = false; iso_info = [] } let unwrap x = x.node -let unwrap_mcode (x,_,_,_,_) = x +let unwrap_mcode (x,_,_,_,_,_) = x let rewrap model x = { model with node = x } -let rewrap_mcode (_,arity,info,mcodekind,pos) x = (x,arity,info,mcodekind,pos) +let rewrap_mcode (_,arity,info,mcodekind,pos,adj) x = + (x,arity,info,mcodekind,pos,adj) let copywrap model x = { model with node = x; index = ref !(model.index); mcodekind = ref !(model.mcodekind); exp_ty = ref !(model.exp_ty)} -let get_pos (_,_,_,_,x) = !x -let get_pos_ref (_,_,_,_,x) = x -let set_pos pos (m,arity,info,mcodekind,_) = (m,arity,info,mcodekind,ref pos) +let get_pos (_,_,_,_,x,_) = !x +let get_pos_ref (_,_,_,_,x,_) = x +let set_pos pos (m,arity,info,mcodekind,_,adj) = + (m,arity,info,mcodekind,ref pos,adj) let get_info x = x.info let set_info x info = {x with info = info} let get_line x = x.info.pos_info.line_start @@ -486,7 +493,7 @@ let get_line_end x = x.info.pos_info.line_end let get_index x = !(x.index) let set_index x i = x.index := i let get_mcodekind x = !(x.mcodekind) -let get_mcode_mcodekind (_,_,_,mcodekind,_) = mcodekind +let get_mcode_mcodekind (_,_,_,mcodekind,_,_) = mcodekind let get_mcodekind_ref x = x.mcodekind let set_mcodekind x mk = x.mcodekind := mk let set_type x t = x.exp_ty := t @@ -501,7 +508,7 @@ let get_test_exp x = x.true_if_test_exp let set_test_exp x = {x with true_if_test_exp = true} let get_iso x = x.iso_info let set_iso x i = if !Flag.track_iso_usage then {x with iso_info = i} else x -let set_mcode_data data (_,ar,info,mc,pos) = (data,ar,info,mc,pos) +let set_mcode_data data (_,ar,info,mc,pos,adj) = (data,ar,info,mc,pos,adj) (* --------------------------------------------------------------------- *) @@ -596,8 +603,8 @@ and const_vol t = (* this function is a rather minimal attempt. the problem is that information has been lost. but since it is only used for metavariable types in the isos, perhaps it doesn't matter *) -and make_mcode x = (x,NONE,default_info(),context_befaft(),ref NoMetaPos) -let make_mcode_info x info = (x,NONE,info,context_befaft(),ref NoMetaPos) +and make_mcode x = (x,NONE,default_info(),context_befaft(),ref NoMetaPos,-1) +let make_mcode_info x info = (x,NONE,info,context_befaft(),ref NoMetaPos,-1) exception TyConv diff --git a/parsing_cocci/ast0_cocci.mli b/parsing_cocci/ast0_cocci.mli index f6db914..6fadc1a 100644 --- a/parsing_cocci/ast0_cocci.mli +++ b/parsing_cocci/ast0_cocci.mli @@ -27,7 +27,10 @@ type info = { pos_info : position_info; strings_before : (string * position_info) list; strings_after : (string * position_info) list } -type 'a mcode = 'a * arity * info * mcodekind * meta_pos ref (* pos, - only *) +type 'a mcode = + 'a * arity * info * mcodekind * meta_pos ref (* pos, - only *) * + int (* adjacency_index *) + and 'a wrap = { node : 'a; info : info; diff --git a/parsing_cocci/ast0toast.ml b/parsing_cocci/ast0toast.ml index d8a0ed9..0809e95 100644 --- a/parsing_cocci/ast0toast.ml +++ b/parsing_cocci/ast0toast.ml @@ -180,7 +180,7 @@ let check_allminus = let donothing r k e = k e in let bind x y = x && y in let option_default = true in - let mcode (_,_,_,mc,_) = + let mcode (_,_,_,mc,_,_) = match mc with Ast0.MINUS(r) -> let (plusses,_) = !r in plusses = [] | _ -> false in @@ -236,28 +236,28 @@ let convert_info info = { Ast.line = info.Ast0.pos_info.Ast0.line_start; Ast.column = info.Ast0.pos_info.Ast0.column; Ast.strbef = strings_to_s info.Ast0.strings_before; - Ast.straft = strings_to_s info.Ast0.strings_after; } + Ast.straft = strings_to_s info.Ast0.strings_after;} -let convert_mcodekind = function +let convert_mcodekind adj = function Ast0.MINUS(replacements) -> let (replacements,_) = !replacements in - Ast.MINUS(Ast.NoPos,replacements) + Ast.MINUS(Ast.NoPos,[],adj,replacements) | Ast0.PLUS -> Ast.PLUS | Ast0.CONTEXT(befaft) -> let (befaft,_,_) = !befaft in Ast.CONTEXT(Ast.NoPos,befaft) | Ast0.MIXED(_) -> failwith "not possible for mcode" -let pos_mcode(term,_,info,mcodekind,pos) = +let pos_mcode(term,_,info,mcodekind,pos,adj) = (* avoids a recursion problem *) - (term,convert_info info,convert_mcodekind mcodekind,Ast.NoMetaPos) + (term,convert_info info,convert_mcodekind adj mcodekind,Ast.NoMetaPos) -let mcode(term,_,info,mcodekind,pos) = +let mcode (term,_,info,mcodekind,pos,adj) = let pos = match !pos with Ast0.MetaPos(pos,constraints,per) -> Ast.MetaPos(pos_mcode pos,constraints,per,unitary,false) | _ -> Ast.NoMetaPos in - (term,convert_info info,convert_mcodekind mcodekind,pos) + (term,convert_info info,convert_mcodekind adj mcodekind,pos) (* --------------------------------------------------------------------- *) (* Dots *) @@ -597,16 +597,16 @@ and statement s = (match Ast0.unwrap s with Ast0.Decl((_,bef),decl) -> Ast.Atomic(rewrap_rule_elem s - (Ast.Decl(convert_mcodekind bef, + (Ast.Decl(convert_mcodekind (-1) bef, check_allminus.VT0.combiner_rec_statement s, declaration decl))) | Ast0.Seq(lbrace,body,rbrace) -> let lbrace = mcode lbrace in - let (decls,body) = separate_decls seqible body in + let body = dots (statement seqible) body in let rbrace = mcode rbrace in Ast.Seq(iso_tokenwrap lbrace s (Ast.SeqStart(lbrace)) (do_isos (Ast0.get_iso s)), - decls,body, + body, tokenwrap rbrace s (Ast.SeqEnd(rbrace))) | Ast0.ExprStatement(exp,sem) -> Ast.Atomic(rewrap_rule_elem s @@ -616,7 +616,7 @@ and statement s = (rewrap_rule_elem s (Ast.IfHeader(mcode iff,mcode lp,expression exp,mcode rp)), statement Ast.NotSequencible branch, - ([],[],[],convert_mcodekind aft)) + ([],[],[],convert_mcodekind (-1) aft)) | Ast0.IfThenElse(iff,lp,exp,rp,branch1,els,branch2,(_,aft)) -> let els = mcode els in Ast.IfThenElse @@ -625,13 +625,13 @@ and statement s = statement Ast.NotSequencible branch1, tokenwrap els s (Ast.Else(els)), statement Ast.NotSequencible branch2, - ([],[],[],convert_mcodekind aft)) + ([],[],[],convert_mcodekind (-1) aft)) | Ast0.While(wh,lp,exp,rp,body,(_,aft)) -> Ast.While(rewrap_rule_elem s (Ast.WhileHeader (mcode wh,mcode lp,expression exp,mcode rp)), statement Ast.NotSequencible body, - ([],[],[],convert_mcodekind aft)) + ([],[],[],convert_mcodekind (-1) aft)) | Ast0.Do(d,body,wh,lp,exp,rp,sem) -> let wh = mcode wh in Ast.Do(rewrap_rule_elem s (Ast.DoHeader(mcode d)), @@ -651,7 +651,7 @@ and statement s = let body = statement Ast.NotSequencible body in Ast.For(rewrap_rule_elem s (Ast.ForHeader(fr,lp,exp1,sem1,exp2,sem2,exp3,rp)), - body,([],[],[],convert_mcodekind aft)) + body,([],[],[],convert_mcodekind (-1) aft)) | Ast0.Iterator(nm,lp,args,rp,body,(_,aft)) -> Ast.Iterator(rewrap_rule_elem s (Ast.IteratorHeader @@ -659,7 +659,7 @@ and statement s = dots expression args, mcode rp)), statement Ast.NotSequencible body, - ([],[],[],convert_mcodekind aft)) + ([],[],[],convert_mcodekind (-1) aft)) | Ast0.Switch(switch,lp,exp,rp,lb,cases,rb) -> let switch = mcode switch in let lp = mcode lp in @@ -743,14 +743,14 @@ and statement s = let params = parameter_list params in let rp = mcode rp in let lbrace = mcode lbrace in - let (decls,body) = separate_decls seqible body in + let body = dots (statement seqible) body in let rbrace = mcode rbrace in let allminus = check_allminus.VT0.combiner_rec_statement s in Ast.FunDecl(rewrap_rule_elem s - (Ast.FunHeader(convert_mcodekind bef, + (Ast.FunHeader(convert_mcodekind (-1) bef, allminus,fi,name,lp,params,rp)), tokenwrap lbrace s (Ast.SeqStart(lbrace)), - decls,body, + body, tokenwrap rbrace s (Ast.SeqEnd(rbrace))) | Ast0.Include(inc,str) -> Ast.Atomic(rewrap_rule_elem s (Ast.Include(mcode inc,mcode str))) @@ -818,6 +818,20 @@ and statement s = | Ast0.CIRCLES(x) -> Ast.CIRCLES(process_list seqible isos x) | Ast0.STARS(x) -> Ast.STARS(process_list seqible isos x)) + (* the following is no longer used. + the goal was to let one put a statement at the very beginning of a function + pattern and have it skip over the declarations in the C code. + that feature was removed a long time ago, however, in favor of + ... when != S, which also causes whatever comes after it to match the + first real statement. + the separation of declarations from the rest of the body means that the + quantifier of any variable shared between them comes out too high, posing + problems when there is ... decl ... stmt, as the quantifier of any shared + variable will be around the whole thing, making variables not free enough + in the first ..., and thus not implementing the expected shortest path + condition. example: f() { ... int A; ... foo(A); }. + the quantifier for A should start just before int A, not at the top of the + function. and separate_decls seqible d = let rec collect_decls = function [] -> ([],[]) @@ -855,7 +869,7 @@ and statement s = match Ast0.unwrap d with Ast0.DOTS(x) -> process x d (function x -> Ast.DOTS x) | Ast0.CIRCLES(x) -> process x d (function x -> Ast.CIRCLES x) - | Ast0.STARS(x) -> process x d (function x -> Ast.STARS x) in + | Ast0.STARS(x) -> process x d (function x -> Ast.STARS x) *) in statement Ast.Sequencible s diff --git a/parsing_cocci/ast_cocci.ml b/parsing_cocci/ast_cocci.ml index 164be27..0d9bd39 100644 --- a/parsing_cocci/ast_cocci.ml +++ b/parsing_cocci/ast_cocci.ml @@ -54,8 +54,11 @@ and 'a befaft = and 'a mcode = 'a * info * mcodekind * meta_pos (* pos variable *) (* pos is an offset indicating where in the C code the mcodekind has an effect *) +(* int list is the match instances, which are only meaningful in annotated +C code *) +(* int is the adjacency index, which is incremented on context dots *) and mcodekind = - MINUS of pos * anything list list + MINUS of pos * int list * int * anything list list | CONTEXT of pos * anything befaft | PLUS and fixpos = @@ -433,7 +436,7 @@ and metaStmtInfo = and rule_elem = base_rule_elem wrap and base_statement = - Seq of rule_elem (* { *) * statement dots * + Seq of rule_elem (* { *) * statement dots * rule_elem (* } *) | IfThen of rule_elem (* header *) * statement * end_info (* endif *) | IfThenElse of rule_elem (* header *) * statement * @@ -450,7 +453,7 @@ and base_statement = (statement dots,statement) whencode list * multi * dots_whencode list * dots_whencode list | FunDecl of rule_elem (* header *) * rule_elem (* { *) * - statement dots * statement dots * rule_elem (* } *) + statement dots * rule_elem (* } *) | Define of rule_elem (* header *) * statement dots | Dots of string mcode (* ... *) * (statement dots,statement) whencode list * @@ -592,6 +595,7 @@ let unwrap_mcode (x,_,_,_) = x let get_mcodekind (_,_,x,_) = x let get_line x = x.node_line let get_mcode_line (_,l,_,_) = l.line +let get_mcode_col (_,l,_,_) = l.column let get_fvs x = x.free_vars let set_fvs fvs x = {x with free_vars = fvs} let get_mfvs x = x.minus_free_vars @@ -684,7 +688,7 @@ and tag2c = function (* --------------------------------------------------------------------- *) -let no_info = { line = 0; column = 0; strbef = []; straft = [] } +let no_info = { line = 0; column = -1; strbef = []; straft = [] } let make_term x = {node = x; diff --git a/parsing_cocci/ast_cocci.mli b/parsing_cocci/ast_cocci.mli index ce55a57..3771a7a 100644 --- a/parsing_cocci/ast_cocci.mli +++ b/parsing_cocci/ast_cocci.mli @@ -30,7 +30,7 @@ and 'a mcode = 'a * info * mcodekind * meta_pos (* pos variable *) (* pos is an offset indicating where in the C code the mcodekind has an effect *) and mcodekind = - MINUS of pos * anything list list + MINUS of pos * int list * int * anything list list | CONTEXT of pos * anything befaft | PLUS and fixpos = @@ -399,7 +399,7 @@ and metaStmtInfo = and rule_elem = base_rule_elem wrap and base_statement = - Seq of rule_elem (* { *) * statement dots * + Seq of rule_elem (* { *) * statement dots * rule_elem (* } *) | IfThen of rule_elem (* header *) * statement * end_info | IfThenElse of rule_elem (* header *) * statement * @@ -416,7 +416,7 @@ and base_statement = (statement dots,statement) whencode list * multi * dots_whencode list * dots_whencode list | FunDecl of rule_elem (* header *) * rule_elem (* { *) * - statement dots * statement dots * rule_elem (* } *) + statement dots * rule_elem (* } *) | Define of rule_elem (* header *) * statement dots | Dots of string mcode (* ... *) * (statement dots,statement) whencode list * @@ -557,6 +557,7 @@ val unwrap_mcode : 'a mcode -> 'a val get_mcodekind : 'a mcode -> mcodekind val get_line : 'a wrap -> line val get_mcode_line : 'a mcode -> line +val get_mcode_col : 'a mcode -> int val get_fvs : 'a wrap -> meta_name list val get_wcfvs : ('a wrap,'b wrap) whencode list -> meta_name list val set_fvs : meta_name list -> 'a wrap -> 'a wrap diff --git a/parsing_cocci/check_meta.ml b/parsing_cocci/check_meta.ml index c1bf4b9..90bdd19 100644 --- a/parsing_cocci/check_meta.ml +++ b/parsing_cocci/check_meta.ml @@ -35,7 +35,7 @@ let fresh_table = (Hashtbl.create(50) : ((string * string), unit) Hashtbl.t) let warning s = Printf.fprintf stderr "warning: %s\n" s -let promote name = (name,(),Ast0.default_info(),(),None) +let promote name = (name,(),Ast0.default_info(),(),None,-1) (* --------------------------------------------------------------------- *) @@ -45,7 +45,7 @@ let find_loop table name = | x::xs -> (try Hashtbl.find x name with Not_found -> loop xs) in loop table -let check_table table minus (name,_,info,_,_) = +let check_table table minus (name,_,info,_,_,_) = let rl = info.Ast0.pos_info.Ast0.line_start in if minus then @@ -83,7 +83,7 @@ let is_ifdef name = let ident context old_metas table minus i = match Ast0.unwrap i with - Ast0.Id((name,_,info,_,_) : string Ast0.mcode) -> + Ast0.Id((name,_,info,_,_,_) : string Ast0.mcode) -> let rl = info.Ast0.pos_info.Ast0.line_start in let err = if List.exists (function x -> x = name) old_metas diff --git a/parsing_cocci/compute_lines.ml b/parsing_cocci/compute_lines.ml index b862e75..8e22419 100644 --- a/parsing_cocci/compute_lines.ml +++ b/parsing_cocci/compute_lines.ml @@ -38,7 +38,7 @@ let mkres x e left right = Ast0.logical_start = lstart.Ast0.pos_info.Ast0.logical_start; Ast0.logical_end = lend.Ast0.pos_info.Ast0.logical_end; Ast0.column = lstart.Ast0.pos_info.Ast0.column; - Ast0.offset = lstart.Ast0.pos_info.Ast0.offset; } in + Ast0.offset = lstart.Ast0.pos_info.Ast0.offset;} in let info = { Ast0.pos_info = pos_info; Ast0.attachable_start = lstart.Ast0.attachable_start; @@ -79,13 +79,13 @@ let get_option fn = function (* --------------------------------------------------------------------- *) (* Mcode *) -let promote_mcode (_,_,info,mcodekind,_) = +let promote_mcode (_,_,info,mcodekind,_,_) = let new_info = {info with Ast0.mcode_start = [mcodekind]; Ast0.mcode_end = [mcodekind]} in {(Ast0.wrap ()) with Ast0.info = new_info; Ast0.mcodekind = ref mcodekind} -let promote_mcode_plus_one (_,_,info,mcodekind,_) = +let promote_mcode_plus_one (_,_,info,mcodekind,_,_) = let new_pos_info = {info.Ast0.pos_info with Ast0.line_start = info.Ast0.pos_info.Ast0.line_start + 1; @@ -125,10 +125,10 @@ let promote_to_statement_start stm mcodekind = {(Ast0.wrap ()) with Ast0.info = new_info; Ast0.mcodekind = ref mcodekind} (* mcode is good by default *) -let bad_mcode (t,a,info,mcodekind,pos) = +let bad_mcode (t,a,info,mcodekind,pos,adj) = let new_info = {info with Ast0.attachable_start = false; Ast0.attachable_end = false} in - (t,a,new_info,mcodekind,pos) + (t,a,new_info,mcodekind,pos,adj) let get_all_start_info l = (List.for_all (function x -> (Ast0.get_info x).Ast0.attachable_start) l, diff --git a/parsing_cocci/context_neg.ml b/parsing_cocci/context_neg.ml index 93de14b..f5c6dee 100644 --- a/parsing_cocci/context_neg.ml +++ b/parsing_cocci/context_neg.ml @@ -139,7 +139,7 @@ let collect_plus_lines top = let bind x y = () in let option_default = () in let donothing r k e = k e in - let mcode (_,_,info,mcodekind,_) = + let mcode (_,_,info,mcodekind,_,_) = match mcodekind with Ast0.PLUS -> insert info.Ast0.pos_info.Ast0.line_start | _ -> () in @@ -228,7 +228,7 @@ let bind c1 c2 = let option_default = (*Bind(Neutral,[],[],[],[],[])*) Recursor(Neutral,[],[],[]) -let mcode (_,_,info,mcodekind,pos) = +let mcode (_,_,info,mcodekind,pos,_) = let offset = info.Ast0.pos_info.Ast0.offset in match mcodekind with Ast0.MINUS(_) -> Token(AllMarked,offset,mcodekind,[]) @@ -236,7 +236,7 @@ let mcode (_,_,info,mcodekind,pos) = | Ast0.CONTEXT(_) -> Token(NotAllMarked,offset,mcodekind,[offset]) | _ -> failwith "not possible" -let neutral_mcode (_,_,info,mcodekind,pos) = +let neutral_mcode (_,_,info,mcodekind,pos,_) = let offset = info.Ast0.pos_info.Ast0.offset in match mcodekind with Ast0.MINUS(_) -> Token(Neutral,offset,mcodekind,[]) @@ -246,7 +246,7 @@ let neutral_mcode (_,_,info,mcodekind,pos) = (* neutral for context; used for mcode in bef aft nodes that don't represent anything if they don't contain some information *) -let nc_mcode (_,_,info,mcodekind,pos) = +let nc_mcode (_,_,info,mcodekind,pos,_) = let offset = info.Ast0.pos_info.Ast0.offset in match mcodekind with Ast0.MINUS(_) -> Token(AllMarked,offset,mcodekind,[]) @@ -403,13 +403,13 @@ let classify is_minus all_marked table code = (* cases for everything with extra mcode *) | Ast0.FunDecl((info,bef),_,_,_,_,_,_,_,_) | Ast0.Decl((info,bef),_) -> - bind (nc_mcode ((),(),info,bef,())) (k s) + bind (nc_mcode ((),(),info,bef,(),-1)) (k s) | Ast0.IfThen(_,_,_,_,_,(info,aft)) | Ast0.IfThenElse(_,_,_,_,_,_,_,(info,aft)) | Ast0.Iterator(_,_,_,_,_,(info,aft)) | Ast0.While(_,_,_,_,_,(info,aft)) | Ast0.For(_,_,_,_,_,_,_,_,_,(info,aft)) -> - bind (k s) (nc_mcode ((),(),info,aft,())) + bind (k s) (nc_mcode ((),(),info,aft,(),-1)) | _ -> k s ) in @@ -432,7 +432,7 @@ the same context children *) (* this is just a sanity check - really only need to look at the top-level structure *) -let equal_mcode (_,_,info1,_,_) (_,_,info2,_,_) = +let equal_mcode (_,_,info1,_,_,_) (_,_,info2,_,_,_) = info1.Ast0.pos_info.Ast0.offset = info2.Ast0.pos_info.Ast0.offset let equal_option e1 e2 = diff --git a/parsing_cocci/free_vars.ml b/parsing_cocci/free_vars.ml index 108d0c9..be830b1 100644 --- a/parsing_cocci/free_vars.ml +++ b/parsing_cocci/free_vars.ml @@ -281,7 +281,7 @@ let cip_mcodekind r mck = (List.map (function l -> List.fold_left (@) [] (List.map astfvs l)) anythings) in match mck with - Ast.MINUS(_,anythings) -> process_anything_list_list anythings + Ast.MINUS(_,_,_,anythings) -> process_anything_list_list anythings | Ast.CONTEXT(_,befaft) -> (match befaft with Ast.BEFORE(ll) -> process_anything_list_list ll diff --git a/parsing_cocci/function_prototypes.ml b/parsing_cocci/function_prototypes.ml index 95fe86b..0814be9 100644 --- a/parsing_cocci/function_prototypes.ml +++ b/parsing_cocci/function_prototypes.ml @@ -38,8 +38,12 @@ let rec get_name name = (* --------------------------------------------------------------------- *) (* collect all of the functions *) -let brace_to_semi (_,arity,info,mcodekind,pos) = - (";",Ast0.NONE,info,mcodekind,pos) +let brace_to_semi (_,arity,info,mcodekind,pos,adj) = + let info = + (* drop column information, so that with -smpl_spacing the semicolon + will come out right after the close parenthesis *) + {info with Ast0.pos_info = {info.Ast0.pos_info with Ast0.column = -1}} in + (";",Ast0.NONE,info,mcodekind,pos,adj) let collect_function (stm : Ast0.statement) = match Ast0.unwrap stm with @@ -123,8 +127,8 @@ let rec align all_minus all_plus = and strip = let donothing r k e = {(Ast0.wrap (Ast0.unwrap (k e))) with Ast0.mcodekind = ref Ast0.PLUS} in - let mcode (mc,_,_,_,_) = - (mc,Ast0.NONE,Ast0.default_info(),Ast0.PLUS,ref Ast0.NoMetaPos) in + let mcode (mc,_,_,_,_,_) = + (mc,Ast0.NONE,Ast0.default_info(),Ast0.PLUS,ref Ast0.NoMetaPos,-1) in (* need a case for everything that has an unvisited component and can be in a function prototype *) @@ -221,12 +225,13 @@ let rec rename_param old_name all param = match Ast0.unwrap param with Ast0.Param(ty,Some id) when all -> (match Ast0.unwrap id with - Ast0.MetaId(((_,name),arity,info,mcodekind,pos),constraints,pure) -> + Ast0.MetaId + (((_,name),arity,info,mcodekind,pos,adj),constraints,pure) -> let nm = ("__no_name__",new_name name) in let new_id = Ast0.rewrap id (Ast0.MetaId - ((nm,arity,info,mcodekind,pos),constraints,Ast0.Pure)) in + ((nm,arity,info,mcodekind,pos,adj),constraints,Ast0.Pure)) in ([Ast.MetaIdDecl(Ast.NONE,nm)], Ast0.rewrap param (Ast0.Param(ty,Some new_id))) | _ -> ([],param)) @@ -318,7 +323,7 @@ let no_names dec = Ast0.get_mcode_mcodekind lp in let pdots = ("...",Ast0.NONE,info,mcodekind, - ref Ast0.NoMetaPos) in + ref Ast0.NoMetaPos,-1) in Ast0.DOTS ([Ast0.rewrap params (Ast0.Pdots(pdots))])), diff --git a/parsing_cocci/get_constants.ml b/parsing_cocci/get_constants.ml index ac9e629..814e9c1 100644 --- a/parsing_cocci/get_constants.ml +++ b/parsing_cocci/get_constants.ml @@ -83,7 +83,7 @@ let get_minus_constants bind orbind = if !Flag.sgrep_mode2 then match ty with - (_,_,Ast.MINUS(_,_),_) -> [Ast.unwrap_mcode ty] + (_,_,Ast.MINUS(_,_,_,_),_) -> [Ast.unwrap_mcode ty] | _ -> [] else [Ast.unwrap_mcode ty] | _ -> k e in @@ -130,7 +130,7 @@ let get_all_minus_constants = let option_default = [] in let mcode r (x,_,mcodekind,_) = match mcodekind with - Ast.MINUS(_,_) -> [x] + Ast.MINUS(_,_,_,_) -> [x] | _ -> [] in let other r (x,_,mcodekind,_) = [] in @@ -156,7 +156,7 @@ let get_plus_constants = bind (fn.V.combiner_anything cur) prev)) [] l in match mcodekind with - Ast.MINUS(_,anythings) -> recurse anythings + Ast.MINUS(_,_,_,anythings) -> recurse anythings | Ast.CONTEXT(_,Ast.BEFORE(a)) -> recurse a | Ast.CONTEXT(_,Ast.AFTER(a)) -> recurse a | Ast.CONTEXT(_,Ast.BEFOREAFTER(a1,a2)) -> diff --git a/parsing_cocci/get_constants2.ml b/parsing_cocci/get_constants2.ml index 9c9f220..93e9ea6 100644 --- a/parsing_cocci/get_constants2.ml +++ b/parsing_cocci/get_constants2.ml @@ -348,7 +348,7 @@ let get_all_constants minus_only = let option_default = [] in let mcode r (x,_,mcodekind,_) = match mcodekind with - Ast.MINUS(_,_) -> [x] + Ast.MINUS(_,_,_,_) -> [x] | _ when minus_only -> [] | _ -> [x] in let other r _ = [] in @@ -376,7 +376,7 @@ let get_plus_constants = bind ((get_all_constants false).V.combiner_anything cur) prev)) [] l in match mcodekind with - Ast.MINUS(_,anythings) -> recurse anythings + Ast.MINUS(_,_,_,anythings) -> recurse anythings | Ast.CONTEXT(_,Ast.BEFORE(a)) -> recurse a | Ast.CONTEXT(_,Ast.AFTER(a)) -> recurse a | Ast.CONTEXT(_,Ast.BEFOREAFTER(a1,a2)) -> diff --git a/parsing_cocci/insert_plus.ml b/parsing_cocci/insert_plus.ml index a6ddbfc..b828c12 100644 --- a/parsing_cocci/insert_plus.ml +++ b/parsing_cocci/insert_plus.ml @@ -158,7 +158,7 @@ let collect_minus_join_points root = let bind x y = x @ y in let option_default = [] in - let mcode (_,_,info,mcodekind,_) = + let mcode (_,_,info,mcodekind,_,_) = if List.mem (info.Ast0.pos_info.Ast0.offset) unfavored_tokens then [(Unfavored,info,mcodekind)] else [(Favored,info,mcodekind)] in @@ -472,13 +472,13 @@ let collect_plus_nodes root = let aft = extract info.Ast0.strings_after in (bef,aft) in - let mcode fn (term,_,info,mcodekind,_) = + let mcode fn (term,_,info,mcodekind,_,_) = match mcodekind with Ast0.PLUS -> [(info,fn term)] | Ast0.CONTEXT _ -> let (bef,aft) = extract_strings info in bef@aft | _ -> [] in - let imcode fn (term,_,info,mcodekind,_) = + let imcode fn (term,_,info,mcodekind,_,_) = match mcodekind with Ast0.PLUS -> [(info,fn term (Ast0toast.convert_info info))] | Ast0.CONTEXT _ -> let (bef,aft) = extract_strings info in bef@aft @@ -980,7 +980,7 @@ let reevaluate_contextness = let bind = (@) in let option_default = [] in - let mcode (_,_,_,mc,_) = + let mcode (_,_,_,mc,_,_) = match mc with Ast0.CONTEXT(mc) -> let (ba,_,_) = !mc in [ba] | _ -> [] in diff --git a/parsing_cocci/iso_pattern.ml b/parsing_cocci/iso_pattern.ml index 46e77e2..16d484b 100644 --- a/parsing_cocci/iso_pattern.ml +++ b/parsing_cocci/iso_pattern.ml @@ -43,8 +43,8 @@ type isomorphism = Ast_cocci.metavar list * Ast0_cocci.anything list list * string (* name *) let strip_info = - let mcode (term,_,_,_,_) = - (term,Ast0.NONE,Ast0.default_info(),Ast0.PLUS,ref Ast0.NoMetaPos) in + let mcode (term,_,_,_,_,_) = + (term,Ast0.NONE,Ast0.default_info(),Ast0.PLUS,ref Ast0.NoMetaPos,-1) in let donothing r k e = let x = k e in {(Ast0.wrap (Ast0.unwrap x)) with @@ -108,8 +108,8 @@ let anything_equal = function failwith "only for isos within iso phase" | _ -> false -let term (var1,_,_,_,_) = var1 -let dot_term (var1,_,info,_,_) = +let term (var1,_,_,_,_,_) = var1 +let dot_term (var1,_,info,_,_,_) = ("", var1 ^ (string_of_int info.Ast0.pos_info.Ast0.offset)) @@ -227,7 +227,7 @@ let rec conjunct_many_bindings = function | [x] -> x | x::xs -> conjunct_bindings x (conjunct_many_bindings xs) -let mcode_equal (x,_,_,_,_) (y,_,_,_,_) = x = y +let mcode_equal (x,_,_,_,_,_) (y,_,_,_,_,_) = x = y let return b binding = if b then OK binding else Fail NonMatch let return_false reason binding = Fail reason @@ -1197,7 +1197,7 @@ let match_statement_dots dochecks context_required whencode_allowed = (* make an entire tree MINUS *) let make_minus = - let mcode (term,arity,info,mcodekind,pos) = + let mcode (term,arity,info,mcodekind,pos,adj) = let new_mcodekind = match mcodekind with Ast0.CONTEXT(mc) -> @@ -1206,7 +1206,7 @@ let make_minus = | _ -> failwith "make_minus: unexpected befaft") | Ast0.MINUS(mc) -> mcodekind (* in the part copied from the src term *) | _ -> failwith "make_minus mcode: unexpected mcodekind" in - (term,arity,info,new_mcodekind,pos) in + (term,arity,info,new_mcodekind,pos,adj) in let update_mc mcodekind e = match !mcodekind with @@ -1331,7 +1331,7 @@ let rebuild_mcode start_line = indices, and so we allow PLUS code as well *) Ast0.PLUS in - let mcode (term,arity,info,mcodekind,pos) = + let mcode (term,arity,info,mcodekind,pos,adj) = let info = match start_line with Some x -> @@ -1341,7 +1341,7 @@ let rebuild_mcode start_line = Ast0.line_end = x; } in {info with Ast0.pos_info = new_pos_info} | None -> info in - (term,arity,info,copy_mcodekind mcodekind,pos) in + (term,arity,info,copy_mcodekind mcodekind,pos,adj) in let copy_one x = let old_info = Ast0.get_info x in @@ -1562,7 +1562,7 @@ let instantiate bindings mv_bindings = let rec renamer = function Type_cocci.MetaType(name,keep,inherited) -> (match - lookup (name,(),(),(),None) bindings mv_bindings + lookup (name,(),(),(),None,-1) bindings mv_bindings with Common.Left(Ast0.TypeCTag(t)) -> Ast0.ast0_type_to_type t @@ -2356,7 +2356,7 @@ let transform (alts : isomorphism) t = (* should be done by functorizing the parser to use wrap or context_wrap *) let rewrap = - let mcode (x,a,i,mc,pos) = (x,a,i,Ast0.context_befaft(),pos) in + let mcode (x,a,i,mc,pos,adj) = (x,a,i,Ast0.context_befaft(),pos,adj) in let donothing r k e = Ast0.context_wrap(Ast0.unwrap(k e)) in V0.flat_rebuilder mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode diff --git a/parsing_cocci/lexer_cocci.mll b/parsing_cocci/lexer_cocci.mll index 0761106..878edc5 100644 --- a/parsing_cocci/lexer_cocci.mll +++ b/parsing_cocci/lexer_cocci.mll @@ -48,7 +48,7 @@ let get_current_line_type lexbuf = let lex_start = Lexing.lexeme_start lexbuf in let preceeding_spaces = if !line_start < 0 then 0 else lex_start - !line_start in - line_start := -1; + (*line_start := -1;*) prev_plus := (c = D.PLUS); (c,l,ll,lex_start,preceeding_spaces,[],[],Ast0.NoMetaPos) let current_line_started = ref false @@ -297,6 +297,8 @@ let init _ = Hashtbl.clear metavariables; Hashtbl.clear type_names; Hashtbl.clear rule_names; + Hashtbl.clear iterator_names; + Hashtbl.clear declarer_names; let get_name (_,x) = x in Data.add_id_meta := (fun name constraints pure -> @@ -591,30 +593,31 @@ rule token = parse | "&" { start_line true; TAnd (get_current_line_type lexbuf) } | "^" { start_line true; TXor(get_current_line_type lexbuf) } - | ( ("#" [' ' '\t']* "define" [' ' '\t']+)) + | (( ("#" [' ' '\t']* "define" [' ' '\t']+)) as def) ( (letter (letter |digit)*) as ident) { start_line true; let (arity,line,lline,offset,col,strbef,straft,pos) as lt = get_current_line_type lexbuf in - let off = String.length "#define " in + let off = String.length def in (* -1 in the code below because the ident is not at the line start *) TDefine (lt, check_var ident - (arity,line,lline,offset+off,(-1),[],[],Ast0.NoMetaPos)) } - | ( ("#" [' ' '\t']* "define" [' ' '\t']+)) + (arity,line,lline,offset+off,col+off,[],[],Ast0.NoMetaPos)) } + | (( ("#" [' ' '\t']* "define" [' ' '\t']+)) as def) ( (letter (letter | digit)*) as ident) '(' { start_line true; let (arity,line,lline,offset,col,strbef,straft,pos) as lt = get_current_line_type lexbuf in - let off = String.length "#define " in + let off = String.length def in TDefineParam (lt, check_var ident (* why pos here but not above? *) - (arity,line,lline,offset+off,(-1),strbef,straft,pos), - offset + off + (String.length ident)) } + (arity,line,lline,offset+off,col+off,strbef,straft,pos), + offset + off + (String.length ident), + col + off + (String.length ident)) } | "#" [' ' '\t']* "include" [' ' '\t']* '"' [^ '"']+ '"' { TIncludeL (let str = tok lexbuf in diff --git a/parsing_cocci/parse_aux.ml b/parsing_cocci/parse_aux.ml index f7f9e0e..8922a0c 100644 --- a/parsing_cocci/parse_aux.ml +++ b/parsing_cocci/parse_aux.ml @@ -44,7 +44,7 @@ let make_info line logical_line offset col strbef straft = let new_pos_info = {Ast0.line_start = line; Ast0.line_end = line; Ast0.logical_start = logical_line; Ast0.logical_end = logical_line; - Ast0.column = col; Ast0.offset = offset;} in + Ast0.column = col; Ast0.offset = offset; } in { Ast0.pos_info = new_pos_info; Ast0.attachable_start = true; Ast0.attachable_end = true; Ast0.mcode_start = []; Ast0.mcode_end = []; @@ -62,31 +62,31 @@ let drop_aft (arity,line,lline,offset,col,strbef,straft,pos) = let clt2mcode str = function (Data.MINUS,line,lline,offset,col,strbef,straft,pos) -> (str,Ast0.NONE,make_info line lline offset col strbef straft, - Ast0.MINUS(ref([],Ast0.default_token_info)),ref pos) + Ast0.MINUS(ref([],Ast0.default_token_info)),ref pos,-1) | (Data.OPTMINUS,line,lline,offset,col,strbef,straft,pos) -> (str,Ast0.OPT,make_info line lline offset col strbef straft, - Ast0.MINUS(ref([],Ast0.default_token_info)),ref pos) + Ast0.MINUS(ref([],Ast0.default_token_info)),ref pos,-1) | (Data.UNIQUEMINUS,line,lline,offset,col,strbef,straft,pos) -> (str,Ast0.UNIQUE,make_info line lline offset col strbef straft, - Ast0.MINUS(ref([],Ast0.default_token_info)),ref pos) + Ast0.MINUS(ref([],Ast0.default_token_info)),ref pos,-1) | (Data.PLUS,line,lline,offset,col,strbef,straft,pos) -> (str,Ast0.NONE,make_info line lline offset col strbef straft,Ast0.PLUS, - ref pos) + ref pos,-1) | (Data.CONTEXT,line,lline,offset,col,strbef,straft,pos) -> (str,Ast0.NONE,make_info line lline offset col strbef straft, Ast0.CONTEXT(ref(Ast.NOTHING, Ast0.default_token_info,Ast0.default_token_info)), - ref pos) + ref pos,-1) | (Data.OPT,line,lline,offset,col,strbef,straft,pos) -> (str,Ast0.OPT,make_info line lline offset col strbef straft, Ast0.CONTEXT(ref(Ast.NOTHING, Ast0.default_token_info,Ast0.default_token_info)), - ref pos) + ref pos,-1) | (Data.UNIQUE,line,lline,offset,col,strbef,straft,pos) -> (str,Ast0.UNIQUE,make_info line lline offset col strbef straft, Ast0.CONTEXT(ref(Ast.NOTHING, Ast0.default_token_info,Ast0.default_token_info)), - ref pos) + ref pos,-1) let id2name (name, clt) = name let id2clt (name, clt) = clt @@ -494,7 +494,7 @@ let make_generated_rule_name_result nm d i a e ee = let make_script_rule_name_result lang deps = let l = id2name lang in - Ast.ScriptRulename (l,deps) + Ast.ScriptRulename (l,deps) let make_initial_script_rule_name_result lang = let l = id2name lang in diff --git a/parsing_cocci/parse_cocci.ml b/parsing_cocci/parse_cocci.ml index db75412..209ab97 100644 --- a/parsing_cocci/parse_cocci.ml +++ b/parsing_cocci/parse_cocci.ml @@ -114,7 +114,7 @@ let token2c (tok,_) = | PC.TIncludeL(s,clt) -> (pr "#include \"%s\"" s)^(line_type2c clt) | PC.TIncludeNL(s,clt) -> (pr "#include <%s>" s)^(line_type2c clt) | PC.TDefine(clt,_) -> "#define"^(line_type2c clt) - | PC.TDefineParam(clt,_,_) -> "#define_param"^(line_type2c clt) + | PC.TDefineParam(clt,_,_,_) -> "#define_param"^(line_type2c clt) | PC.TMinusFile(s,clt) -> (pr "--- %s" s)^(line_type2c clt) | PC.TPlusFile(s,clt) -> (pr "+++ %s" s)^(line_type2c clt) @@ -286,7 +286,7 @@ let plus_attachable only_plus (tok,_) = | PC.Textern(clt) | PC.Tconst(clt) | PC.Tvolatile(clt) | PC.TIncludeL(_,clt) | PC.TIncludeNL(_,clt) | PC.TDefine(clt,_) - | PC.TDefineParam(clt,_,_) | PC.TMinusFile(_,clt) | PC.TPlusFile(_,clt) + | PC.TDefineParam(clt,_,_,_) | PC.TMinusFile(_,clt) | PC.TPlusFile(_,clt) | PC.TInc(clt) | PC.TDec(clt) @@ -351,7 +351,7 @@ let get_clt (tok,_) = | PC.Textern(clt) | PC.Tconst(clt) | PC.Tvolatile(clt) | PC.TIncludeL(_,clt) | PC.TIncludeNL(_,clt) | PC.TDefine(clt,_) - | PC.TDefineParam(clt,_,_) | PC.TMinusFile(_,clt) | PC.TPlusFile(_,clt) + | PC.TDefineParam(clt,_,_,_) | PC.TMinusFile(_,clt) | PC.TPlusFile(_,clt) | PC.TInc(clt) | PC.TDec(clt) @@ -428,7 +428,7 @@ let update_clt (tok,x) clt = | PC.TIncludeL(s,_) -> (PC.TIncludeL(s,clt),x) | PC.TIncludeNL(s,_) -> (PC.TIncludeNL(s,clt),x) | PC.TDefine(_,a) -> (PC.TDefine(clt,a),x) - | PC.TDefineParam(_,a,b) -> (PC.TDefineParam(clt,a,b),x) + | PC.TDefineParam(_,a,b,c) -> (PC.TDefineParam(clt,a,b,c),x) | PC.TMinusFile(s,_) -> (PC.TMinusFile(s,clt),x) | PC.TPlusFile(s,_) -> (PC.TPlusFile(s,clt),x) @@ -614,7 +614,7 @@ let split_token ((tok,_) as t) = | PC.TPlusFile(s,clt) | PC.TMinusFile(s,clt) | PC.TIncludeL(s,clt) | PC.TIncludeNL(s,clt) -> split t clt - | PC.TDefine(clt,_) | PC.TDefineParam(clt,_,_) -> split t clt + | PC.TDefine(clt,_) | PC.TDefineParam(clt,_,_,_) -> split t clt | PC.TIf(clt) | PC.TElse(clt) | PC.TWhile(clt) | PC.TFor(clt) | PC.TDo(clt) | PC.TSwitch(clt) | PC.TCase(clt) | PC.TDefault(clt) @@ -887,7 +887,7 @@ let token2line (tok,_) = | PC.TPtrOp(clt) - | PC.TDefine(clt,_) | PC.TDefineParam(clt,_,_) + | PC.TDefine(clt,_) | PC.TDefineParam(clt,_,_,_) | PC.TIncludeL(_,clt) | PC.TIncludeNL(_,clt) | PC.TEq(clt) | PC.TAssign(_,clt) | PC.TDot(clt) | PC.TComma(clt) @@ -901,7 +901,7 @@ let rec insert_line_end = function | (((PC.TWhen(clt),q) as x)::xs) -> x::(find_line_end true (token2line x) clt q xs) | (((PC.TDefine(clt,_),q) as x)::xs) - | (((PC.TDefineParam(clt,_,_),q) as x)::xs) -> + | (((PC.TDefineParam(clt,_,_,_),q) as x)::xs) -> x::(find_line_end false (token2line x) clt q xs) | x::xs -> x::(insert_line_end xs) @@ -1654,6 +1654,8 @@ let process file isofile verbose = some restrictions on the -+ code *) ([],_) | (_,Ast.Generated) -> ([],minus) | _ -> Iso_pattern.apply_isos chosen_isos minus rule_name in + (* after iso, because iso can intro ... *) + let minus = Adjacency.compute_adjacency minus in let minus = Comm_assoc.comm_assoc minus rule_name dropiso in let minus = if !Flag.sgrep_mode2 then minus diff --git a/parsing_cocci/parser_cocci_menhir.ml b/parsing_cocci/parser_cocci_menhir.ml index 66f731b..a5bb657 100644 --- a/parsing_cocci/parser_cocci_menhir.ml +++ b/parsing_cocci/parser_cocci_menhir.ml @@ -553,7 +553,7 @@ type token = | TDepends | TDefineParam of ( # 82 "parser_cocci_menhir.mly" - (Data.clt * token * int) + (Data.clt * token * int * int) # 558 "parser_cocci_menhir.ml" ) | TDefine of ( @@ -1529,7 +1529,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_aexpr = -# 1766 "parser_cocci_menhir.mly" +# 1767 "parser_cocci_menhir.mly" ( Ast0.set_arg_exp _1 ) # 1535 "parser_cocci_menhir.ml" in @@ -1557,7 +1557,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_aexpr = -# 1768 "parser_cocci_menhir.mly" +# 1769 "parser_cocci_menhir.mly" ( let (nm,lenname,pure,clt) = _1 in let nm = P.clt2mcode nm clt in let lenname = @@ -1587,7 +1587,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_aexpr = -# 1776 "parser_cocci_menhir.mly" +# 1777 "parser_cocci_menhir.mly" ( Ast0.set_arg_exp(Ast0.wrap(Ast0.TypeExp(_1))) ) # 1593 "parser_cocci_menhir.ml" in @@ -1609,7 +1609,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_any_strict = -# 1820 "parser_cocci_menhir.mly" +# 1821 "parser_cocci_menhir.mly" ( Ast.WhenAny ) # 1615 "parser_cocci_menhir.ml" in @@ -1631,7 +1631,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_any_strict = -# 1821 "parser_cocci_menhir.mly" +# 1822 "parser_cocci_menhir.mly" ( Ast.WhenStrict ) # 1637 "parser_cocci_menhir.ml" in @@ -1653,7 +1653,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_any_strict = -# 1822 "parser_cocci_menhir.mly" +# 1823 "parser_cocci_menhir.mly" ( Ast.WhenForall ) # 1659 "parser_cocci_menhir.ml" in @@ -1675,7 +1675,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_any_strict = -# 1823 "parser_cocci_menhir.mly" +# 1824 "parser_cocci_menhir.mly" ( Ast.WhenExists ) # 1681 "parser_cocci_menhir.ml" in @@ -1699,7 +1699,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1263 "parser_cocci_menhir.mly" +# 1264 "parser_cocci_menhir.mly" ( _1 ) # 1705 "parser_cocci_menhir.ml" in @@ -1739,7 +1739,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1265 "parser_cocci_menhir.mly" +# 1266 "parser_cocci_menhir.mly" ( P.arith_op Ast.Mul _1 _2 _3 ) # 1745 "parser_cocci_menhir.ml" in @@ -1779,7 +1779,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1267 "parser_cocci_menhir.mly" +# 1268 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in P.arith_op op _1 clt _3 ) # 1785 "parser_cocci_menhir.ml" in @@ -1819,7 +1819,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1269 "parser_cocci_menhir.mly" +# 1270 "parser_cocci_menhir.mly" ( P.arith_op Ast.Plus _1 _2 _3 ) # 1825 "parser_cocci_menhir.ml" in @@ -1859,7 +1859,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1271 "parser_cocci_menhir.mly" +# 1272 "parser_cocci_menhir.mly" ( P.arith_op Ast.Minus _1 _2 _3 ) # 1865 "parser_cocci_menhir.ml" in @@ -1899,7 +1899,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1273 "parser_cocci_menhir.mly" +# 1274 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in P.arith_op op _1 clt _3 ) # 1905 "parser_cocci_menhir.ml" in @@ -1939,7 +1939,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1275 "parser_cocci_menhir.mly" +# 1276 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in P.logic_op op _1 clt _3 ) # 1945 "parser_cocci_menhir.ml" in @@ -1979,7 +1979,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1277 "parser_cocci_menhir.mly" +# 1278 "parser_cocci_menhir.mly" ( P.logic_op Ast.Eq _1 _2 _3 ) # 1985 "parser_cocci_menhir.ml" in @@ -2019,7 +2019,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1279 "parser_cocci_menhir.mly" +# 1280 "parser_cocci_menhir.mly" ( P.logic_op Ast.NotEq _1 _2 _3 ) # 2025 "parser_cocci_menhir.ml" in @@ -2059,7 +2059,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1281 "parser_cocci_menhir.mly" +# 1282 "parser_cocci_menhir.mly" ( P.arith_op Ast.And _1 _2 _3 ) # 2065 "parser_cocci_menhir.ml" in @@ -2099,7 +2099,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1283 "parser_cocci_menhir.mly" +# 1284 "parser_cocci_menhir.mly" ( P.arith_op Ast.Or _1 _2 _3 ) # 2105 "parser_cocci_menhir.ml" in @@ -2139,7 +2139,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1285 "parser_cocci_menhir.mly" +# 1286 "parser_cocci_menhir.mly" ( P.arith_op Ast.Xor _1 _2 _3 ) # 2145 "parser_cocci_menhir.ml" in @@ -2179,7 +2179,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1287 "parser_cocci_menhir.mly" +# 1288 "parser_cocci_menhir.mly" ( P.logic_op Ast.AndLog _1 _2 _3 ) # 2185 "parser_cocci_menhir.ml" in @@ -2219,7 +2219,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_dot_expressions_ = -# 1289 "parser_cocci_menhir.mly" +# 1290 "parser_cocci_menhir.mly" ( P.logic_op Ast.OrLog _1 _2 _3 ) # 2225 "parser_cocci_menhir.ml" in @@ -2243,7 +2243,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1263 "parser_cocci_menhir.mly" +# 1264 "parser_cocci_menhir.mly" ( _1 ) # 2249 "parser_cocci_menhir.ml" in @@ -2283,7 +2283,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1265 "parser_cocci_menhir.mly" +# 1266 "parser_cocci_menhir.mly" ( P.arith_op Ast.Mul _1 _2 _3 ) # 2289 "parser_cocci_menhir.ml" in @@ -2323,7 +2323,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1267 "parser_cocci_menhir.mly" +# 1268 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in P.arith_op op _1 clt _3 ) # 2329 "parser_cocci_menhir.ml" in @@ -2363,7 +2363,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1269 "parser_cocci_menhir.mly" +# 1270 "parser_cocci_menhir.mly" ( P.arith_op Ast.Plus _1 _2 _3 ) # 2369 "parser_cocci_menhir.ml" in @@ -2403,7 +2403,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1271 "parser_cocci_menhir.mly" +# 1272 "parser_cocci_menhir.mly" ( P.arith_op Ast.Minus _1 _2 _3 ) # 2409 "parser_cocci_menhir.ml" in @@ -2443,7 +2443,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1273 "parser_cocci_menhir.mly" +# 1274 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in P.arith_op op _1 clt _3 ) # 2449 "parser_cocci_menhir.ml" in @@ -2483,7 +2483,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1275 "parser_cocci_menhir.mly" +# 1276 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in P.logic_op op _1 clt _3 ) # 2489 "parser_cocci_menhir.ml" in @@ -2523,7 +2523,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1277 "parser_cocci_menhir.mly" +# 1278 "parser_cocci_menhir.mly" ( P.logic_op Ast.Eq _1 _2 _3 ) # 2529 "parser_cocci_menhir.ml" in @@ -2563,7 +2563,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1279 "parser_cocci_menhir.mly" +# 1280 "parser_cocci_menhir.mly" ( P.logic_op Ast.NotEq _1 _2 _3 ) # 2569 "parser_cocci_menhir.ml" in @@ -2603,7 +2603,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1281 "parser_cocci_menhir.mly" +# 1282 "parser_cocci_menhir.mly" ( P.arith_op Ast.And _1 _2 _3 ) # 2609 "parser_cocci_menhir.ml" in @@ -2643,7 +2643,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1283 "parser_cocci_menhir.mly" +# 1284 "parser_cocci_menhir.mly" ( P.arith_op Ast.Or _1 _2 _3 ) # 2649 "parser_cocci_menhir.ml" in @@ -2683,7 +2683,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1285 "parser_cocci_menhir.mly" +# 1286 "parser_cocci_menhir.mly" ( P.arith_op Ast.Xor _1 _2 _3 ) # 2689 "parser_cocci_menhir.ml" in @@ -2723,7 +2723,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1287 "parser_cocci_menhir.mly" +# 1288 "parser_cocci_menhir.mly" ( P.logic_op Ast.AndLog _1 _2 _3 ) # 2729 "parser_cocci_menhir.ml" in @@ -2763,7 +2763,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_invalid_ = -# 1289 "parser_cocci_menhir.mly" +# 1290 "parser_cocci_menhir.mly" ( P.logic_op Ast.OrLog _1 _2 _3 ) # 2769 "parser_cocci_menhir.ml" in @@ -2787,7 +2787,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1263 "parser_cocci_menhir.mly" +# 1264 "parser_cocci_menhir.mly" ( _1 ) # 2793 "parser_cocci_menhir.ml" in @@ -2827,7 +2827,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1265 "parser_cocci_menhir.mly" +# 1266 "parser_cocci_menhir.mly" ( P.arith_op Ast.Mul _1 _2 _3 ) # 2833 "parser_cocci_menhir.ml" in @@ -2867,7 +2867,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1267 "parser_cocci_menhir.mly" +# 1268 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in P.arith_op op _1 clt _3 ) # 2873 "parser_cocci_menhir.ml" in @@ -2907,7 +2907,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1269 "parser_cocci_menhir.mly" +# 1270 "parser_cocci_menhir.mly" ( P.arith_op Ast.Plus _1 _2 _3 ) # 2913 "parser_cocci_menhir.ml" in @@ -2947,7 +2947,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1271 "parser_cocci_menhir.mly" +# 1272 "parser_cocci_menhir.mly" ( P.arith_op Ast.Minus _1 _2 _3 ) # 2953 "parser_cocci_menhir.ml" in @@ -2987,7 +2987,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1273 "parser_cocci_menhir.mly" +# 1274 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in P.arith_op op _1 clt _3 ) # 2993 "parser_cocci_menhir.ml" in @@ -3027,7 +3027,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1275 "parser_cocci_menhir.mly" +# 1276 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in P.logic_op op _1 clt _3 ) # 3033 "parser_cocci_menhir.ml" in @@ -3067,7 +3067,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1277 "parser_cocci_menhir.mly" +# 1278 "parser_cocci_menhir.mly" ( P.logic_op Ast.Eq _1 _2 _3 ) # 3073 "parser_cocci_menhir.ml" in @@ -3107,7 +3107,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1279 "parser_cocci_menhir.mly" +# 1280 "parser_cocci_menhir.mly" ( P.logic_op Ast.NotEq _1 _2 _3 ) # 3113 "parser_cocci_menhir.ml" in @@ -3147,7 +3147,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1281 "parser_cocci_menhir.mly" +# 1282 "parser_cocci_menhir.mly" ( P.arith_op Ast.And _1 _2 _3 ) # 3153 "parser_cocci_menhir.ml" in @@ -3187,7 +3187,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1283 "parser_cocci_menhir.mly" +# 1284 "parser_cocci_menhir.mly" ( P.arith_op Ast.Or _1 _2 _3 ) # 3193 "parser_cocci_menhir.ml" in @@ -3227,7 +3227,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1285 "parser_cocci_menhir.mly" +# 1286 "parser_cocci_menhir.mly" ( P.arith_op Ast.Xor _1 _2 _3 ) # 3233 "parser_cocci_menhir.ml" in @@ -3267,7 +3267,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1287 "parser_cocci_menhir.mly" +# 1288 "parser_cocci_menhir.mly" ( P.logic_op Ast.AndLog _1 _2 _3 ) # 3273 "parser_cocci_menhir.ml" in @@ -3307,7 +3307,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_eexpr_nest_expressions_ = -# 1289 "parser_cocci_menhir.mly" +# 1290 "parser_cocci_menhir.mly" ( P.logic_op Ast.OrLog _1 _2 _3 ) # 3313 "parser_cocci_menhir.ml" in @@ -3331,7 +3331,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1263 "parser_cocci_menhir.mly" +# 1264 "parser_cocci_menhir.mly" ( _1 ) # 3337 "parser_cocci_menhir.ml" in @@ -3371,7 +3371,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1265 "parser_cocci_menhir.mly" +# 1266 "parser_cocci_menhir.mly" ( P.arith_op Ast.Mul _1 _2 _3 ) # 3377 "parser_cocci_menhir.ml" in @@ -3411,7 +3411,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1267 "parser_cocci_menhir.mly" +# 1268 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in P.arith_op op _1 clt _3 ) # 3417 "parser_cocci_menhir.ml" in @@ -3451,7 +3451,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1269 "parser_cocci_menhir.mly" +# 1270 "parser_cocci_menhir.mly" ( P.arith_op Ast.Plus _1 _2 _3 ) # 3457 "parser_cocci_menhir.ml" in @@ -3491,7 +3491,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1271 "parser_cocci_menhir.mly" +# 1272 "parser_cocci_menhir.mly" ( P.arith_op Ast.Minus _1 _2 _3 ) # 3497 "parser_cocci_menhir.ml" in @@ -3531,7 +3531,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1273 "parser_cocci_menhir.mly" +# 1274 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in P.arith_op op _1 clt _3 ) # 3537 "parser_cocci_menhir.ml" in @@ -3571,7 +3571,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1275 "parser_cocci_menhir.mly" +# 1276 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in P.logic_op op _1 clt _3 ) # 3577 "parser_cocci_menhir.ml" in @@ -3611,7 +3611,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1277 "parser_cocci_menhir.mly" +# 1278 "parser_cocci_menhir.mly" ( P.logic_op Ast.Eq _1 _2 _3 ) # 3617 "parser_cocci_menhir.ml" in @@ -3651,7 +3651,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1279 "parser_cocci_menhir.mly" +# 1280 "parser_cocci_menhir.mly" ( P.logic_op Ast.NotEq _1 _2 _3 ) # 3657 "parser_cocci_menhir.ml" in @@ -3691,7 +3691,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1281 "parser_cocci_menhir.mly" +# 1282 "parser_cocci_menhir.mly" ( P.arith_op Ast.And _1 _2 _3 ) # 3697 "parser_cocci_menhir.ml" in @@ -3731,7 +3731,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1283 "parser_cocci_menhir.mly" +# 1284 "parser_cocci_menhir.mly" ( P.arith_op Ast.Or _1 _2 _3 ) # 3737 "parser_cocci_menhir.ml" in @@ -3771,7 +3771,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1285 "parser_cocci_menhir.mly" +# 1286 "parser_cocci_menhir.mly" ( P.arith_op Ast.Xor _1 _2 _3 ) # 3777 "parser_cocci_menhir.ml" in @@ -3811,7 +3811,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1287 "parser_cocci_menhir.mly" +# 1288 "parser_cocci_menhir.mly" ( P.logic_op Ast.AndLog _1 _2 _3 ) # 3817 "parser_cocci_menhir.ml" in @@ -3851,7 +3851,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_arith_expr_expr_invalid_ = -# 1289 "parser_cocci_menhir.mly" +# 1290 "parser_cocci_menhir.mly" ( P.logic_op Ast.OrLog _1 _2 _3 ) # 3857 "parser_cocci_menhir.ml" in @@ -3978,7 +3978,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_l_ in let _endpos = _endpos_r_ in let _v : 'tv_array_dec = -# 1070 "parser_cocci_menhir.mly" +# 1071 "parser_cocci_menhir.mly" ( (l,i,r) ) # 3984 "parser_cocci_menhir.ml" in @@ -4002,7 +4002,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_assign_expr_eexpr_dot_expressions_ = -# 1235 "parser_cocci_menhir.mly" +# 1236 "parser_cocci_menhir.mly" ( _1 ) # 4008 "parser_cocci_menhir.ml" in @@ -4042,7 +4042,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_assign_expr_eexpr_dot_expressions_ = -# 1237 "parser_cocci_menhir.mly" +# 1238 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in Ast0.wrap(Ast0.Assignment(_1,P.clt2mcode op clt, Ast0.set_arg_exp _3,false)) ) @@ -4084,7 +4084,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_assign_expr_eexpr_dot_expressions_ = -# 1241 "parser_cocci_menhir.mly" +# 1242 "parser_cocci_menhir.mly" ( Ast0.wrap (Ast0.Assignment (_1,P.clt2mcode Ast.SimpleAssign _2,Ast0.set_arg_exp _3,false)) ) @@ -4110,7 +4110,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_assign_expr_eexpr_nest_expressions_ = -# 1235 "parser_cocci_menhir.mly" +# 1236 "parser_cocci_menhir.mly" ( _1 ) # 4116 "parser_cocci_menhir.ml" in @@ -4150,7 +4150,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_assign_expr_eexpr_nest_expressions_ = -# 1237 "parser_cocci_menhir.mly" +# 1238 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in Ast0.wrap(Ast0.Assignment(_1,P.clt2mcode op clt, Ast0.set_arg_exp _3,false)) ) @@ -4192,7 +4192,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_assign_expr_eexpr_nest_expressions_ = -# 1241 "parser_cocci_menhir.mly" +# 1242 "parser_cocci_menhir.mly" ( Ast0.wrap (Ast0.Assignment (_1,P.clt2mcode Ast.SimpleAssign _2,Ast0.set_arg_exp _3,false)) ) @@ -4218,7 +4218,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_assign_expr_expr_invalid_ = -# 1235 "parser_cocci_menhir.mly" +# 1236 "parser_cocci_menhir.mly" ( _1 ) # 4224 "parser_cocci_menhir.ml" in @@ -4258,7 +4258,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_assign_expr_expr_invalid_ = -# 1237 "parser_cocci_menhir.mly" +# 1238 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in Ast0.wrap(Ast0.Assignment(_1,P.clt2mcode op clt, Ast0.set_arg_exp _3,false)) ) @@ -4300,7 +4300,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_assign_expr_expr_invalid_ = -# 1241 "parser_cocci_menhir.mly" +# 1242 "parser_cocci_menhir.mly" ( Ast0.wrap (Ast0.Assignment (_1,P.clt2mcode Ast.SimpleAssign _2,Ast0.set_arg_exp _3,false)) ) @@ -4326,7 +4326,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_assign_expr_bis = -# 1246 "parser_cocci_menhir.mly" +# 1247 "parser_cocci_menhir.mly" ( _1 ) # 4332 "parser_cocci_menhir.ml" in @@ -4366,7 +4366,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_assign_expr_bis = -# 1248 "parser_cocci_menhir.mly" +# 1249 "parser_cocci_menhir.mly" ( let (op,clt) = _2 in Ast0.wrap(Ast0.Assignment(_1,P.clt2mcode op clt, Ast0.set_arg_exp _3,false)) ) @@ -4408,7 +4408,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_assign_expr_bis = -# 1252 "parser_cocci_menhir.mly" +# 1253 "parser_cocci_menhir.mly" ( Ast0.wrap (Ast0.Assignment (_1,P.clt2mcode Ast.SimpleAssign _2,Ast0.set_arg_exp _3,false)) ) @@ -4434,7 +4434,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_basic_expr_eexpr_dot_expressions_ = -# 1232 "parser_cocci_menhir.mly" +# 1233 "parser_cocci_menhir.mly" ( _1 ) # 4440 "parser_cocci_menhir.ml" in @@ -4458,7 +4458,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_basic_expr_eexpr_nest_expressions_ = -# 1232 "parser_cocci_menhir.mly" +# 1233 "parser_cocci_menhir.mly" ( _1 ) # 4464 "parser_cocci_menhir.ml" in @@ -4482,7 +4482,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_basic_expr_expr_invalid_ = -# 1232 "parser_cocci_menhir.mly" +# 1233 "parser_cocci_menhir.mly" ( _1 ) # 4488 "parser_cocci_menhir.ml" in @@ -4526,7 +4526,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_case_line = -# 942 "parser_cocci_menhir.mly" +# 943 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Default(P.clt2mcode "default" _1,P.clt2mcode ":" _2,_3)) ) # 4532 "parser_cocci_menhir.ml" in @@ -4576,7 +4576,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_case_line = -# 944 "parser_cocci_menhir.mly" +# 945 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Case(P.clt2mcode "case" _1,_2,P.clt2mcode ":" _3,_4)) ) # 4582 "parser_cocci_menhir.ml" in @@ -4600,7 +4600,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_cast_expr_eexpr_dot_expressions_ = -# 1292 "parser_cocci_menhir.mly" +# 1293 "parser_cocci_menhir.mly" ( _1 ) # 4606 "parser_cocci_menhir.ml" in @@ -4650,7 +4650,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_lp_ in let _endpos = _endpos_e_ in let _v : 'tv_cast_expr_eexpr_dot_expressions_ = -# 1294 "parser_cocci_menhir.mly" +# 1295 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Cast (P.clt2mcode "(" lp, t, P.clt2mcode ")" rp, e)) ) # 4657 "parser_cocci_menhir.ml" @@ -4675,7 +4675,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_cast_expr_eexpr_invalid_ = -# 1292 "parser_cocci_menhir.mly" +# 1293 "parser_cocci_menhir.mly" ( _1 ) # 4681 "parser_cocci_menhir.ml" in @@ -4725,7 +4725,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_lp_ in let _endpos = _endpos_e_ in let _v : 'tv_cast_expr_eexpr_invalid_ = -# 1294 "parser_cocci_menhir.mly" +# 1295 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Cast (P.clt2mcode "(" lp, t, P.clt2mcode ")" rp, e)) ) # 4732 "parser_cocci_menhir.ml" @@ -4750,7 +4750,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_cast_expr_eexpr_nest_expressions_ = -# 1292 "parser_cocci_menhir.mly" +# 1293 "parser_cocci_menhir.mly" ( _1 ) # 4756 "parser_cocci_menhir.ml" in @@ -4800,7 +4800,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_lp_ in let _endpos = _endpos_e_ in let _v : 'tv_cast_expr_eexpr_nest_expressions_ = -# 1294 "parser_cocci_menhir.mly" +# 1295 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Cast (P.clt2mcode "(" lp, t, P.clt2mcode ")" rp, e)) ) # 4807 "parser_cocci_menhir.ml" @@ -4825,7 +4825,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_cast_expr_expr_invalid_ = -# 1292 "parser_cocci_menhir.mly" +# 1293 "parser_cocci_menhir.mly" ( _1 ) # 4831 "parser_cocci_menhir.ml" in @@ -4875,7 +4875,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_lp_ in let _endpos = _endpos_e_ in let _v : 'tv_cast_expr_expr_invalid_ = -# 1294 "parser_cocci_menhir.mly" +# 1295 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Cast (P.clt2mcode "(" lp, t, P.clt2mcode ")" rp, e)) ) # 4882 "parser_cocci_menhir.ml" @@ -4942,7 +4942,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_comma_decls_TEllipsis_decl_ = -# 1567 "parser_cocci_menhir.mly" +# 1568 "parser_cocci_menhir.mly" ( function dot_builder -> [Ast0.wrap(Ast0.PComma(P.clt2mcode "," _1)); dot_builder _2] ) @@ -4978,7 +4978,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_comma_decls_TEllipsis_decl_ = -# 1571 "parser_cocci_menhir.mly" +# 1572 "parser_cocci_menhir.mly" ( function dot_builder -> [Ast0.wrap(Ast0.PComma(P.clt2mcode "," _1)); _2] ) # 4985 "parser_cocci_menhir.ml" @@ -5017,7 +5017,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_comma_decls_TEllipsis_name_opt_decl_ = -# 1567 "parser_cocci_menhir.mly" +# 1568 "parser_cocci_menhir.mly" ( function dot_builder -> [Ast0.wrap(Ast0.PComma(P.clt2mcode "," _1)); dot_builder _2] ) @@ -5053,7 +5053,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_comma_decls_TEllipsis_name_opt_decl_ = -# 1571 "parser_cocci_menhir.mly" +# 1572 "parser_cocci_menhir.mly" ( function dot_builder -> [Ast0.wrap(Ast0.PComma(P.clt2mcode "," _1)); _2] ) # 5060 "parser_cocci_menhir.ml" @@ -5071,7 +5071,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_comma_initializers_edots_when_TEllipsis_initialize__ = -# 1123 "parser_cocci_menhir.mly" +# 1124 "parser_cocci_menhir.mly" ( [] ) # 5077 "parser_cocci_menhir.ml" in @@ -5101,7 +5101,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_d_ in let _endpos = _endpos_r_ in let _v : 'tv_comma_initializers_edots_when_TEllipsis_initialize__ = -# 1125 "parser_cocci_menhir.mly" +# 1126 "parser_cocci_menhir.mly" ( (function dot_builder -> [dot_builder d])::r ) # 5107 "parser_cocci_menhir.ml" in @@ -5141,7 +5141,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_i_ in let _endpos = _endpos_r_ in let _v : 'tv_comma_initializers_edots_when_TEllipsis_initialize__ = -# 1127 "parser_cocci_menhir.mly" +# 1128 "parser_cocci_menhir.mly" ( (function dot_builder -> [i; Ast0.wrap(Ast0.IComma(P.clt2mcode "," c))]):: r ) # 5148 "parser_cocci_menhir.ml" @@ -5159,7 +5159,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_comma_initializers2_edots_when_TEllipsis_initialize__ = -# 1131 "parser_cocci_menhir.mly" +# 1132 "parser_cocci_menhir.mly" ( [] ) # 5165 "parser_cocci_menhir.ml" in @@ -5199,7 +5199,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_i_ in let _endpos = _endpos_r_ in let _v : 'tv_comma_initializers2_edots_when_TEllipsis_initialize__ = -# 1133 "parser_cocci_menhir.mly" +# 1134 "parser_cocci_menhir.mly" ( (function dot_builder -> [i; Ast0.wrap(Ast0.IComma(P.clt2mcode "," c))]):: r ) # 5206 "parser_cocci_menhir.ml" @@ -5224,7 +5224,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_any_strict_ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5230 "parser_cocci_menhir.ml" in @@ -5248,7 +5248,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_ctype_ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5254 "parser_cocci_menhir.ml" in @@ -5272,7 +5272,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_d_ident_ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5278 "parser_cocci_menhir.ml" in @@ -5296,7 +5296,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_dexpr_ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5302 "parser_cocci_menhir.ml" in @@ -5320,7 +5320,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_ident_or_const_ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5326 "parser_cocci_menhir.ml" in @@ -5344,7 +5344,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_meta_ident_ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5350 "parser_cocci_menhir.ml" in @@ -5368,7 +5368,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_pure_ident_ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5374 "parser_cocci_menhir.ml" in @@ -5392,7 +5392,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_pure_ident_or_meta_ident_ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5398 "parser_cocci_menhir.ml" in @@ -5416,7 +5416,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_not_eq_not_ceq__ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5422 "parser_cocci_menhir.ml" in @@ -5440,7 +5440,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_not_eq_not_eq__ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5446 "parser_cocci_menhir.ml" in @@ -5464,7 +5464,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_not_eq_not_eqe__ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5470 "parser_cocci_menhir.ml" in @@ -5488,7 +5488,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_not_eq_not_pos__ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5494 "parser_cocci_menhir.ml" in @@ -5512,7 +5512,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_seed_ = -# 1798 "parser_cocci_menhir.mly" +# 1799 "parser_cocci_menhir.mly" ( _1 ) # 5518 "parser_cocci_menhir.ml" in @@ -5536,7 +5536,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_cond_expr_eexpr_dot_expressions_ = -# 1257 "parser_cocci_menhir.mly" +# 1258 "parser_cocci_menhir.mly" ( _1 ) # 5542 "parser_cocci_menhir.ml" in @@ -5592,7 +5592,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_l_ in let _endpos = _endpos_r_ in let _v : 'tv_cond_expr_eexpr_dot_expressions_ = -# 1259 "parser_cocci_menhir.mly" +# 1260 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.CondExpr (l, P.clt2mcode "?" w, t, P.clt2mcode ":" dd, r)) ) # 5599 "parser_cocci_menhir.ml" @@ -5617,7 +5617,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_cond_expr_eexpr_nest_expressions_ = -# 1257 "parser_cocci_menhir.mly" +# 1258 "parser_cocci_menhir.mly" ( _1 ) # 5623 "parser_cocci_menhir.ml" in @@ -5673,7 +5673,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_l_ in let _endpos = _endpos_r_ in let _v : 'tv_cond_expr_eexpr_nest_expressions_ = -# 1259 "parser_cocci_menhir.mly" +# 1260 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.CondExpr (l, P.clt2mcode "?" w, t, P.clt2mcode ":" dd, r)) ) # 5680 "parser_cocci_menhir.ml" @@ -5698,7 +5698,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_cond_expr_expr_invalid_ = -# 1257 "parser_cocci_menhir.mly" +# 1258 "parser_cocci_menhir.mly" ( _1 ) # 5704 "parser_cocci_menhir.ml" in @@ -5754,7 +5754,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_l_ in let _endpos = _endpos_r_ in let _v : 'tv_cond_expr_expr_invalid_ = -# 1259 "parser_cocci_menhir.mly" +# 1260 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.CondExpr (l, P.clt2mcode "?" w, t, P.clt2mcode ":" dd, r)) ) # 5761 "parser_cocci_menhir.ml" @@ -5783,7 +5783,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_const_vol = -# 851 "parser_cocci_menhir.mly" +# 852 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.Const _1 ) # 5789 "parser_cocci_menhir.ml" in @@ -5811,7 +5811,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_const_vol = -# 852 "parser_cocci_menhir.mly" +# 853 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.Volatile _1 ) # 5817 "parser_cocci_menhir.ml" in @@ -6352,7 +6352,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_d_ident = -# 1061 "parser_cocci_menhir.mly" +# 1062 "parser_cocci_menhir.mly" ( (_1, function t -> List.fold_right @@ -6389,7 +6389,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_t_ in let _endpos = _endpos_i_ in let _v : 'tv_decl = -# 821 "parser_cocci_menhir.mly" +# 822 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Param(t, Some i)) ) # 6395 "parser_cocci_menhir.ml" in @@ -6475,7 +6475,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_t_ in let _endpos = _endpos_rp1_ in let _v : 'tv_decl = -# 824 "parser_cocci_menhir.mly" +# 825 "parser_cocci_menhir.mly" ( let fnptr = Ast0.wrap (Ast0.FunctionPointer @@ -6508,7 +6508,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_t_ in let _endpos = _endpos_t_ in let _v : 'tv_decl = -# 831 "parser_cocci_menhir.mly" +# 832 "parser_cocci_menhir.mly" ( let ty = Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" t])) in Ast0.wrap(Ast0.VoidParam(ty)) ) @@ -6538,7 +6538,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl = -# 835 "parser_cocci_menhir.mly" +# 836 "parser_cocci_menhir.mly" ( let (nm,pure,clt) = _1 in Ast0.wrap(Ast0.MetaParam(P.clt2mcode nm clt,pure)) ) # 6545 "parser_cocci_menhir.ml" @@ -6567,7 +6567,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl_ident = -# 1516 "parser_cocci_menhir.mly" +# 1517 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) ) # 6573 "parser_cocci_menhir.ml" in @@ -6595,7 +6595,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl_ident = -# 1518 "parser_cocci_menhir.mly" +# 1519 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,clt) = _1 in Ast0.wrap(Ast0.MetaId(P.clt2mcode nm clt,constraints,pure)) ) # 6602 "parser_cocci_menhir.ml" @@ -6613,7 +6613,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_decl_list_decl_ = -# 1538 "parser_cocci_menhir.mly" +# 1539 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DOTS([])) ) # 6619 "parser_cocci_menhir.ml" in @@ -6637,7 +6637,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl_list_decl_ = -# 1540 "parser_cocci_menhir.mly" +# 1541 "parser_cocci_menhir.mly" (let circle x = match Ast0.unwrap x with Ast0.Pcircles(_) -> true | _ -> false in if List.exists circle _1 @@ -6658,7 +6658,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_decl_list_name_opt_decl_ = -# 1538 "parser_cocci_menhir.mly" +# 1539 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DOTS([])) ) # 6664 "parser_cocci_menhir.ml" in @@ -6682,7 +6682,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl_list_name_opt_decl_ = -# 1540 "parser_cocci_menhir.mly" +# 1541 "parser_cocci_menhir.mly" (let circle x = match Ast0.unwrap x with Ast0.Pcircles(_) -> true | _ -> false in if List.exists circle _1 @@ -6710,7 +6710,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl_list_start_decl_ = -# 1547 "parser_cocci_menhir.mly" +# 1548 "parser_cocci_menhir.mly" ( [_1] ) # 6716 "parser_cocci_menhir.ml" in @@ -6750,7 +6750,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_decl_list_start_decl_ = -# 1549 "parser_cocci_menhir.mly" +# 1550 "parser_cocci_menhir.mly" ( _1::Ast0.wrap(Ast0.PComma(P.clt2mcode "," _2))::_3 ) # 6756 "parser_cocci_menhir.ml" in @@ -6784,7 +6784,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_decl_list_start_decl_ = -# 1551 "parser_cocci_menhir.mly" +# 1552 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Pdots(P.clt2mcode "..." _1)):: (List.concat(List.map (function x -> x (P.mkpdots "...")) _2)) ) # 6791 "parser_cocci_menhir.ml" @@ -6809,7 +6809,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl_list_start_name_opt_decl_ = -# 1547 "parser_cocci_menhir.mly" +# 1548 "parser_cocci_menhir.mly" ( [_1] ) # 6815 "parser_cocci_menhir.ml" in @@ -6849,7 +6849,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_decl_list_start_name_opt_decl_ = -# 1549 "parser_cocci_menhir.mly" +# 1550 "parser_cocci_menhir.mly" ( _1::Ast0.wrap(Ast0.PComma(P.clt2mcode "," _2))::_3 ) # 6855 "parser_cocci_menhir.ml" in @@ -6883,7 +6883,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_decl_list_start_name_opt_decl_ = -# 1551 "parser_cocci_menhir.mly" +# 1552 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Pdots(P.clt2mcode "..." _1)):: (List.concat(List.map (function x -> x (P.mkpdots "...")) _2)) ) # 6890 "parser_cocci_menhir.ml" @@ -6912,7 +6912,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl_statement = -# 1139 "parser_cocci_menhir.mly" +# 1140 "parser_cocci_menhir.mly" ( let (nm,pure,clt) = _1 in [Ast0.wrap(Ast0.MetaStmt(P.clt2mcode nm clt,pure))] ) # 6919 "parser_cocci_menhir.ml" @@ -6937,7 +6937,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl_statement = -# 1142 "parser_cocci_menhir.mly" +# 1143 "parser_cocci_menhir.mly" ( List.map (function x -> Ast0.wrap @@ -6965,7 +6965,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl_statement = -# 1147 "parser_cocci_menhir.mly" +# 1148 "parser_cocci_menhir.mly" ( [_1] ) # 6971 "parser_cocci_menhir.ml" in @@ -7009,7 +7009,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_decl_statement = -# 1156 "parser_cocci_menhir.mly" +# 1157 "parser_cocci_menhir.mly" ( let (mids,code) = t in if List.for_all (function x -> @@ -7045,7 +7045,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl_statement_expr = -# 1169 "parser_cocci_menhir.mly" +# 1170 "parser_cocci_menhir.mly" ( let (nm,pure,clt) = _1 in [Ast0.wrap(Ast0.MetaStmt(P.clt2mcode nm clt,pure))] ) # 7052 "parser_cocci_menhir.ml" @@ -7070,7 +7070,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl_statement_expr = -# 1172 "parser_cocci_menhir.mly" +# 1173 "parser_cocci_menhir.mly" ( List.map (function x -> Ast0.wrap @@ -7098,7 +7098,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_decl_statement_expr = -# 1177 "parser_cocci_menhir.mly" +# 1178 "parser_cocci_menhir.mly" ( [_1] ) # 7104 "parser_cocci_menhir.ml" in @@ -7142,7 +7142,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_decl_statement_expr = -# 1186 "parser_cocci_menhir.mly" +# 1187 "parser_cocci_menhir.mly" ( let (mids,code) = t in if List.for_all (function [] -> true | _ -> false) code then [] @@ -7183,7 +7183,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_t_ in let _endpos = _endpos_pv_ in let _v : 'tv_decl_var = -# 952 "parser_cocci_menhir.mly" +# 953 "parser_cocci_menhir.mly" ( [Ast0.wrap(Ast0.TyDecl(t,P.clt2mcode ";" pv))] ) # 7189 "parser_cocci_menhir.ml" in @@ -7230,7 +7230,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 954 "parser_cocci_menhir.mly" +# 955 "parser_cocci_menhir.mly" ( List.map (function (id,fn) -> Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv))) @@ -7287,7 +7287,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 954 "parser_cocci_menhir.mly" +# 955 "parser_cocci_menhir.mly" ( List.map (function (id,fn) -> Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv))) @@ -7314,7 +7314,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_f_ in let _endpos = _endpos_f_ in let _v : 'tv_decl_var = -# 958 "parser_cocci_menhir.mly" +# 959 "parser_cocci_menhir.mly" ( [f] ) # 7320 "parser_cocci_menhir.ml" in @@ -7377,7 +7377,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 960 "parser_cocci_menhir.mly" +# 961 "parser_cocci_menhir.mly" (let (id,fn) = d in [Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv))]) # 7384 "parser_cocci_menhir.ml" @@ -7448,7 +7448,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 960 "parser_cocci_menhir.mly" +# 961 "parser_cocci_menhir.mly" (let (id,fn) = d in [Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv))]) # 7455 "parser_cocci_menhir.ml" @@ -7503,7 +7503,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 965 "parser_cocci_menhir.mly" +# 966 "parser_cocci_menhir.mly" ( List.map (function (id,fn) -> let idtype = @@ -7569,7 +7569,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 965 "parser_cocci_menhir.mly" +# 966 "parser_cocci_menhir.mly" ( List.map (function (id,fn) -> let idtype = @@ -7635,7 +7635,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 965 "parser_cocci_menhir.mly" +# 966 "parser_cocci_menhir.mly" ( List.map (function (id,fn) -> let idtype = @@ -7708,7 +7708,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 965 "parser_cocci_menhir.mly" +# 966 "parser_cocci_menhir.mly" ( List.map (function (id,fn) -> let idtype = @@ -7783,7 +7783,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 973 "parser_cocci_menhir.mly" +# 974 "parser_cocci_menhir.mly" ( let (id,fn) = d in !Data.add_type_name (P.id2name i); let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in @@ -7864,7 +7864,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 973 "parser_cocci_menhir.mly" +# 974 "parser_cocci_menhir.mly" ( let (id,fn) = d in !Data.add_type_name (P.id2name i); let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in @@ -7945,7 +7945,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 973 "parser_cocci_menhir.mly" +# 974 "parser_cocci_menhir.mly" ( let (id,fn) = d in !Data.add_type_name (P.id2name i); let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in @@ -8033,7 +8033,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 973 "parser_cocci_menhir.mly" +# 974 "parser_cocci_menhir.mly" ( let (id,fn) = d in !Data.add_type_name (P.id2name i); let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in @@ -8140,7 +8140,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 983 "parser_cocci_menhir.mly" +# 984 "parser_cocci_menhir.mly" ( let (id,fn) = d in let t = Ast0.wrap @@ -8256,7 +8256,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 983 "parser_cocci_menhir.mly" +# 984 "parser_cocci_menhir.mly" ( let (id,fn) = d in let t = Ast0.wrap @@ -8322,7 +8322,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : 'tv_decl_var = -# 991 "parser_cocci_menhir.mly" +# 992 "parser_cocci_menhir.mly" ( [Ast0.wrap(Ast0.MacroDecl(_1,P.clt2mcode "(" _2,_3, P.clt2mcode ")" _4,P.clt2mcode ";" _5))] ) # 8329 "parser_cocci_menhir.ml" @@ -8442,7 +8442,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 997 "parser_cocci_menhir.mly" +# 998 "parser_cocci_menhir.mly" ( let (id,fn) = d in let t = Ast0.wrap @@ -8574,7 +8574,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct in -# 997 "parser_cocci_menhir.mly" +# 998 "parser_cocci_menhir.mly" ( let (id,fn) = d in let t = Ast0.wrap @@ -8630,7 +8630,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_s_ in let _endpos = _endpos_pv_ in let _v : 'tv_decl_var = -# 1005 "parser_cocci_menhir.mly" +# 1006 "parser_cocci_menhir.mly" ( let s = P.clt2mcode "typedef" s in [Ast0.wrap(Ast0.Typedef(s,t,id,P.clt2mcode ";" pv))] ) # 8637 "parser_cocci_menhir.ml" @@ -8655,7 +8655,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_define_param_list = -# 713 "parser_cocci_menhir.mly" +# 714 "parser_cocci_menhir.mly" (let circle x = match Ast0.unwrap x with Ast0.DPcircles(_) -> true | _ -> false in if List.exists circle _1 @@ -8683,7 +8683,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_define_param_list_option = -# 737 "parser_cocci_menhir.mly" +# 738 "parser_cocci_menhir.mly" ( _1 ) # 8689 "parser_cocci_menhir.ml" in @@ -8700,7 +8700,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_define_param_list_option = -# 738 "parser_cocci_menhir.mly" +# 739 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DOTS([])) ) # 8706 "parser_cocci_menhir.ml" in @@ -8724,7 +8724,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_define_param_list_start = -# 720 "parser_cocci_menhir.mly" +# 721 "parser_cocci_menhir.mly" ( [Ast0.wrap(Ast0.DParam _1)] ) # 8730 "parser_cocci_menhir.ml" in @@ -8764,7 +8764,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_define_param_list_start = -# 722 "parser_cocci_menhir.mly" +# 723 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DParam _1):: Ast0.wrap(Ast0.DPComma(P.clt2mcode "," _2))::_3 ) # 8771 "parser_cocci_menhir.ml" @@ -8799,7 +8799,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_d_ in let _endpos = _endpos_r_ in let _v : 'tv_define_param_list_start = -# 725 "parser_cocci_menhir.mly" +# 726 "parser_cocci_menhir.mly" ( (P.mkdpdots "..." d):: (List.concat (List.map (function x -> x (P.mkdpdots "...")) r)) ) # 8806 "parser_cocci_menhir.ml" @@ -8881,18 +8881,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : 'tv_define_param_list_option = Obj.magic _2 in let _1 : ( # 82 "parser_cocci_menhir.mly" - (Data.clt * token * int) + (Data.clt * token * int * int) # 8886 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_defineop = # 690 "parser_cocci_menhir.mly" - ( let (clt,ident,parenoff) = _1 in + ( let (clt,ident,parenoff,parencol) = _1 in + (* clt is the start of the #define itself *) let (arity,line,lline,offset,col,strbef,straft,pos) = clt in let lp = P.clt2mcode "(" - (arity,line,lline,parenoff,0,[],[],Ast0.NoMetaPos) in + (arity,line,lline,parenoff,parencol,[],[],Ast0.NoMetaPos) in function body -> Ast0.wrap (Ast0.Define @@ -8907,7 +8908,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (Semantic_cocci.Semantic "unexpected name for a #define")), Ast0.wrap (Ast0.DParams (lp,_2,P.clt2mcode ")" _3)),body)) ) -# 8911 "parser_cocci_menhir.ml" +# 8912 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -8931,7 +8932,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_dep = # 225 "parser_cocci_menhir.mly" ( _1 ) -# 8935 "parser_cocci_menhir.ml" +# 8936 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -8965,7 +8966,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_dep = # 226 "parser_cocci_menhir.mly" ( Ast.AndDep(_1, _3) ) -# 8969 "parser_cocci_menhir.ml" +# 8970 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -8999,7 +9000,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_dep = # 227 "parser_cocci_menhir.mly" ( Ast.OrDep (_1, _3) ) -# 9003 "parser_cocci_menhir.ml" +# 9004 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9016,7 +9017,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_depends = # 221 "parser_cocci_menhir.mly" ( Ast.NoDep ) -# 9020 "parser_cocci_menhir.ml" +# 9021 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9048,7 +9049,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_depends = # 222 "parser_cocci_menhir.mly" ( parents ) -# 9052 "parser_cocci_menhir.ml" +# 9053 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9075,14 +9076,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 9079 "parser_cocci_menhir.ml" +# 9080 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_designator = -# 1103 "parser_cocci_menhir.mly" +# 1104 "parser_cocci_menhir.mly" ( Ast0.DesignatorField (P.clt2mcode "." _1,_2) ) -# 9086 "parser_cocci_menhir.ml" +# 9087 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9113,20 +9114,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 102 "parser_cocci_menhir.mly" (Data.clt) -# 9117 "parser_cocci_menhir.ml" +# 9118 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_eexpr = Obj.magic _2 in let _1 : ( # 102 "parser_cocci_menhir.mly" (Data.clt) -# 9123 "parser_cocci_menhir.ml" +# 9124 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_designator = -# 1105 "parser_cocci_menhir.mly" +# 1106 "parser_cocci_menhir.mly" ( Ast0.DesignatorIndex (P.clt2mcode "[" _1,_2,P.clt2mcode "]" _3) ) -# 9130 "parser_cocci_menhir.ml" +# 9131 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9167,27 +9168,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _5 : ( # 102 "parser_cocci_menhir.mly" (Data.clt) -# 9171 "parser_cocci_menhir.ml" +# 9172 "parser_cocci_menhir.ml" ) = Obj.magic _5 in let _4 : 'tv_eexpr = Obj.magic _4 in let _3 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 9177 "parser_cocci_menhir.ml" +# 9178 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_eexpr = Obj.magic _2 in let _1 : ( # 102 "parser_cocci_menhir.mly" (Data.clt) -# 9183 "parser_cocci_menhir.ml" +# 9184 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : 'tv_designator = -# 1107 "parser_cocci_menhir.mly" +# 1108 "parser_cocci_menhir.mly" ( Ast0.DesignatorRange (P.clt2mcode "[" _1,_2,P.clt2mcode "..." _3, _4,P.clt2mcode "]" _5) ) -# 9191 "parser_cocci_menhir.ml" +# 9192 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9209,9 +9210,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_dexpr = -# 1206 "parser_cocci_menhir.mly" +# 1207 "parser_cocci_menhir.mly" ( _1 ) -# 9215 "parser_cocci_menhir.ml" +# 9216 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9239,7 +9240,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_disable = # 240 "parser_cocci_menhir.mly" ( List.map P.id2name _2 ) -# 9243 "parser_cocci_menhir.ml" +# 9244 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9260,14 +9261,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 9264 "parser_cocci_menhir.ml" +# 9265 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_dot_expressions = -# 1215 "parser_cocci_menhir.mly" +# 1216 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Edots(P.clt2mcode "..." _1,None)) ) -# 9271 "parser_cocci_menhir.ml" +# 9272 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9289,9 +9290,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_dot_expressions = -# 1216 "parser_cocci_menhir.mly" +# 1217 "parser_cocci_menhir.mly" ( _1 ) -# 9295 "parser_cocci_menhir.ml" +# 9296 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9317,20 +9318,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let d : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 9321 "parser_cocci_menhir.ml" +# 9322 "parser_cocci_menhir.ml" ) = Obj.magic d in let c : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 9326 "parser_cocci_menhir.ml" +# 9327 "parser_cocci_menhir.ml" ) = Obj.magic c in let _startpos = _startpos_c_ in let _endpos = _endpos_d_ in let _v : 'tv_dp_comma_args_TEllipsis_ = -# 730 "parser_cocci_menhir.mly" +# 731 "parser_cocci_menhir.mly" ( function dot_builder -> [Ast0.wrap(Ast0.DPComma(P.clt2mcode "," c)); dot_builder d] ) -# 9334 "parser_cocci_menhir.ml" +# 9335 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9357,16 +9358,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 9361 "parser_cocci_menhir.ml" +# 9362 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_dp_comma_args_TEllipsis_ = -# 733 "parser_cocci_menhir.mly" +# 734 "parser_cocci_menhir.mly" ( function dot_builder -> [Ast0.wrap(Ast0.DPComma(P.clt2mcode "," _1)); Ast0.wrap(Ast0.DParam _2)] ) -# 9370 "parser_cocci_menhir.ml" +# 9371 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9387,14 +9388,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let d : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 9391 "parser_cocci_menhir.ml" +# 9392 "parser_cocci_menhir.ml" ) = Obj.magic d in let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : 'tv_edots_when_TEllipsis_eexpr_ = -# 1808 "parser_cocci_menhir.mly" +# 1809 "parser_cocci_menhir.mly" ( (d,None) ) -# 9398 "parser_cocci_menhir.ml" +# 9399 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9433,14 +9434,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let d : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 9437 "parser_cocci_menhir.ml" +# 9438 "parser_cocci_menhir.ml" ) = Obj.magic d in let _startpos = _startpos_d_ in let _endpos = _endpos__5_ in let _v : 'tv_edots_when_TEllipsis_eexpr_ = -# 1809 "parser_cocci_menhir.mly" +# 1810 "parser_cocci_menhir.mly" ( (d,Some w) ) -# 9444 "parser_cocci_menhir.ml" +# 9445 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9461,14 +9462,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let d : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 9465 "parser_cocci_menhir.ml" +# 9466 "parser_cocci_menhir.ml" ) = Obj.magic d in let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : 'tv_edots_when_TEllipsis_initialize_ = -# 1808 "parser_cocci_menhir.mly" +# 1809 "parser_cocci_menhir.mly" ( (d,None) ) -# 9472 "parser_cocci_menhir.ml" +# 9473 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9507,14 +9508,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let d : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 9511 "parser_cocci_menhir.ml" +# 9512 "parser_cocci_menhir.ml" ) = Obj.magic d in let _startpos = _startpos_d_ in let _endpos = _endpos__5_ in let _v : 'tv_edots_when_TEllipsis_initialize_ = -# 1809 "parser_cocci_menhir.mly" +# 1810 "parser_cocci_menhir.mly" ( (d,Some w) ) -# 9518 "parser_cocci_menhir.ml" +# 9519 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9535,14 +9536,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let d : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 9539 "parser_cocci_menhir.ml" +# 9540 "parser_cocci_menhir.ml" ) = Obj.magic d in let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : 'tv_edots_when_TEllipsis_struct_decl_ = -# 1808 "parser_cocci_menhir.mly" +# 1809 "parser_cocci_menhir.mly" ( (d,None) ) -# 9546 "parser_cocci_menhir.ml" +# 9547 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9581,14 +9582,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let d : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 9585 "parser_cocci_menhir.ml" +# 9586 "parser_cocci_menhir.ml" ) = Obj.magic d in let _startpos = _startpos_d_ in let _endpos = _endpos__5_ in let _v : 'tv_edots_when_TEllipsis_struct_decl_ = -# 1809 "parser_cocci_menhir.mly" +# 1810 "parser_cocci_menhir.mly" ( (d,Some w) ) -# 9592 "parser_cocci_menhir.ml" +# 9593 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9610,9 +9611,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_eexpr = -# 1204 "parser_cocci_menhir.mly" +# 1205 "parser_cocci_menhir.mly" ( _1 ) -# 9616 "parser_cocci_menhir.ml" +# 9617 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9634,7 +9635,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_eexpr_list = -# 1752 "parser_cocci_menhir.mly" +# 1753 "parser_cocci_menhir.mly" (let circle x = match Ast0.unwrap x with Ast0.Ecircles(_) -> true | _ -> false in let star x = @@ -9645,7 +9646,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct if List.exists star _1 then Ast0.wrap(Ast0.STARS(_1)) else Ast0.wrap(Ast0.DOTS(_1)) ) -# 9649 "parser_cocci_menhir.ml" +# 9650 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9667,9 +9668,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_eexpr_list_option = -# 1791 "parser_cocci_menhir.mly" +# 1792 "parser_cocci_menhir.mly" ( _1 ) -# 9673 "parser_cocci_menhir.ml" +# 9674 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9684,9 +9685,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_eexpr_list_option = -# 1792 "parser_cocci_menhir.mly" +# 1793 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DOTS([])) ) -# 9690 "parser_cocci_menhir.ml" +# 9691 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9708,9 +9709,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_eexpr_list_start = -# 1779 "parser_cocci_menhir.mly" +# 1780 "parser_cocci_menhir.mly" ( [_1] ) -# 9714 "parser_cocci_menhir.ml" +# 9715 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9742,15 +9743,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 9746 "parser_cocci_menhir.ml" +# 9747 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_aexpr = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_eexpr_list_start = -# 1781 "parser_cocci_menhir.mly" +# 1782 "parser_cocci_menhir.mly" ( _1::Ast0.wrap(Ast0.EComma(P.clt2mcode "," _2))::_3 ) -# 9754 "parser_cocci_menhir.ml" +# 9755 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9792,9 +9793,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__6_ in let _v : 'tv_error_words = -# 1578 "parser_cocci_menhir.mly" +# 1579 "parser_cocci_menhir.mly" ( [Ast0.wrap(Ast0.ERRORWORDS(cl))] ) -# 9798 "parser_cocci_menhir.ml" +# 9799 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9816,7 +9817,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_exists = # 243 "parser_cocci_menhir.mly" ( Ast.Exists ) -# 9820 "parser_cocci_menhir.ml" +# 9821 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9838,7 +9839,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_exists = # 244 "parser_cocci_menhir.mly" ( Ast.Forall ) -# 9842 "parser_cocci_menhir.ml" +# 9843 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9864,7 +9865,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_exists = # 245 "parser_cocci_menhir.mly" ( Ast.ReverseForall ) -# 9868 "parser_cocci_menhir.ml" +# 9869 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9881,7 +9882,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_exists = # 246 "parser_cocci_menhir.mly" ( Ast.Undetermined ) -# 9885 "parser_cocci_menhir.ml" +# 9886 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9903,9 +9904,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_expr = -# 1202 "parser_cocci_menhir.mly" +# 1203 "parser_cocci_menhir.mly" ( _1 ) -# 9909 "parser_cocci_menhir.ml" +# 9910 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9927,9 +9928,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_r_ in let _endpos = _endpos_r_ in let _v : 'tv_expr_dots_TEllipsis_ = -# 1384 "parser_cocci_menhir.mly" +# 1385 "parser_cocci_menhir.mly" ( r ) -# 9933 "parser_cocci_menhir.ml" +# 9934 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9946,7 +9947,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_extends = # 216 "parser_cocci_menhir.mly" ( () ) -# 9950 "parser_cocci_menhir.ml" +# 9951 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -9971,14 +9972,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let parent : ( # 47 "parser_cocci_menhir.mly" (string) -# 9975 "parser_cocci_menhir.ml" +# 9976 "parser_cocci_menhir.ml" ) = Obj.magic parent in let _startpos = _startpos__1_ in let _endpos = _endpos_parent_ in let _v : 'tv_extends = # 218 "parser_cocci_menhir.mly" ( !Data.install_bindings (parent) ) -# 9982 "parser_cocci_menhir.ml" +# 9983 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10004,12 +10005,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 83 "parser_cocci_menhir.mly" (string * Data.clt) -# 10008 "parser_cocci_menhir.ml" +# 10009 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 83 "parser_cocci_menhir.mly" (string * Data.clt) -# 10013 "parser_cocci_menhir.ml" +# 10014 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in @@ -10018,7 +10019,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( [Ast0.wrap (Ast0.FILEINFO(P.id2mcode _1, P.id2mcode _2))] ) -# 10022 "parser_cocci_menhir.ml" +# 10023 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10048,7 +10049,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_fn_ctype = # 581 "parser_cocci_menhir.mly" ( P.pointerify ty m ) -# 10052 "parser_cocci_menhir.ml" +# 10053 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10075,7 +10076,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let t : ( # 50 "parser_cocci_menhir.mly" (Data.clt) -# 10079 "parser_cocci_menhir.ml" +# 10080 "parser_cocci_menhir.ml" ) = Obj.magic t in let _startpos = _startpos_t_ in let _endpos = _endpos_m_ in @@ -10084,7 +10085,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( P.pointerify (Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" t]))) m ) -# 10088 "parser_cocci_menhir.ml" +# 10089 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10099,9 +10100,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_fninfo = -# 776 "parser_cocci_menhir.mly" +# 777 "parser_cocci_menhir.mly" ( [] ) -# 10105 "parser_cocci_menhir.ml" +# 10106 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10129,13 +10130,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fninfo = -# 778 "parser_cocci_menhir.mly" +# 779 "parser_cocci_menhir.mly" ( try let _ = List.find (function Ast0.FStorage(_) -> true | _ -> false) _2 in raise (Semantic_cocci.Semantic "duplicate storage") with Not_found -> (Ast0.FStorage(_1))::_2 ) -# 10139 "parser_cocci_menhir.ml" +# 10140 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10163,9 +10164,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_t_ in let _endpos = _endpos_r_ in let _v : 'tv_fninfo = -# 783 "parser_cocci_menhir.mly" +# 784 "parser_cocci_menhir.mly" ( (Ast0.FType(t))::r ) -# 10169 "parser_cocci_menhir.ml" +# 10170 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10192,17 +10193,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 53 "parser_cocci_menhir.mly" (Data.clt) -# 10196 "parser_cocci_menhir.ml" +# 10197 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fninfo = -# 785 "parser_cocci_menhir.mly" +# 786 "parser_cocci_menhir.mly" ( try let _ = List.find (function Ast0.FInline(_) -> true | _ -> false) _2 in raise (Semantic_cocci.Semantic "duplicate inline") with Not_found -> (Ast0.FInline(P.clt2mcode "inline" _1))::_2 ) -# 10206 "parser_cocci_menhir.ml" +# 10207 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10229,17 +10230,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 55 "parser_cocci_menhir.mly" (string * Data.clt) -# 10233 "parser_cocci_menhir.ml" +# 10234 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fninfo = -# 790 "parser_cocci_menhir.mly" +# 791 "parser_cocci_menhir.mly" ( try let _ = List.find (function Ast0.FAttr(_) -> true | _ -> false) _2 in raise (Semantic_cocci.Semantic "multiple attributes") with Not_found -> (Ast0.FAttr(P.id2mcode _1))::_2 ) -# 10243 "parser_cocci_menhir.ml" +# 10244 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10254,9 +10255,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_fninfo_nt = -# 796 "parser_cocci_menhir.mly" +# 797 "parser_cocci_menhir.mly" ( [] ) -# 10260 "parser_cocci_menhir.ml" +# 10261 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10284,13 +10285,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fninfo_nt = -# 798 "parser_cocci_menhir.mly" +# 799 "parser_cocci_menhir.mly" ( try let _ = List.find (function Ast0.FStorage(_) -> true | _ -> false) _2 in raise (Semantic_cocci.Semantic "duplicate storage") with Not_found -> (Ast0.FStorage(_1))::_2 ) -# 10294 "parser_cocci_menhir.ml" +# 10295 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10317,17 +10318,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 53 "parser_cocci_menhir.mly" (Data.clt) -# 10321 "parser_cocci_menhir.ml" +# 10322 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fninfo_nt = -# 804 "parser_cocci_menhir.mly" +# 805 "parser_cocci_menhir.mly" ( try let _ = List.find (function Ast0.FInline(_) -> true | _ -> false) _2 in raise (Semantic_cocci.Semantic "duplicate inline") with Not_found -> (Ast0.FInline(P.clt2mcode "inline" _1))::_2 ) -# 10331 "parser_cocci_menhir.ml" +# 10332 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10354,17 +10355,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 55 "parser_cocci_menhir.mly" (string * Data.clt) -# 10358 "parser_cocci_menhir.ml" +# 10359 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fninfo_nt = -# 809 "parser_cocci_menhir.mly" +# 810 "parser_cocci_menhir.mly" ( try let _ = List.find (function Ast0.FAttr(_) -> true | _ -> false) _2 in raise (Semantic_cocci.Semantic "duplicate init") with Not_found -> (Ast0.FAttr(P.id2mcode _1))::_2 ) -# 10368 "parser_cocci_menhir.ml" +# 10369 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10379,9 +10380,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_fun_after_dots = -# 1700 "parser_cocci_menhir.mly" +# 1701 "parser_cocci_menhir.mly" ([]) -# 10385 "parser_cocci_menhir.ml" +# 10386 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10407,9 +10408,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fun_after_dots = -# 1701 "parser_cocci_menhir.mly" +# 1702 "parser_cocci_menhir.mly" (_2) -# 10413 "parser_cocci_menhir.ml" +# 10414 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10437,9 +10438,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fun_after_dots = -# 1702 "parser_cocci_menhir.mly" +# 1703 "parser_cocci_menhir.mly" (Ast0.wrap(Ast0.Exp(_1))::_2) -# 10443 "parser_cocci_menhir.ml" +# 10444 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10467,9 +10468,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fun_after_dots = -# 1703 "parser_cocci_menhir.mly" +# 1704 "parser_cocci_menhir.mly" (_1@_2) -# 10473 "parser_cocci_menhir.ml" +# 10474 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10484,9 +10485,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_fun_after_dots_or = -# 1710 "parser_cocci_menhir.mly" +# 1711 "parser_cocci_menhir.mly" ([]) -# 10490 "parser_cocci_menhir.ml" +# 10491 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10512,9 +10513,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fun_after_dots_or = -# 1711 "parser_cocci_menhir.mly" +# 1712 "parser_cocci_menhir.mly" (_2) -# 10518 "parser_cocci_menhir.ml" +# 10519 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10542,9 +10543,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fun_after_dots_or = -# 1712 "parser_cocci_menhir.mly" +# 1713 "parser_cocci_menhir.mly" (Ast0.wrap(Ast0.Exp(_1))::_2) -# 10548 "parser_cocci_menhir.ml" +# 10549 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10572,9 +10573,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fun_after_dots_or = -# 1713 "parser_cocci_menhir.mly" +# 1714 "parser_cocci_menhir.mly" (_1@_2) -# 10578 "parser_cocci_menhir.ml" +# 10579 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10602,9 +10603,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fun_after_exp = -# 1706 "parser_cocci_menhir.mly" +# 1707 "parser_cocci_menhir.mly" (_1::_2) -# 10608 "parser_cocci_menhir.ml" +# 10609 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10619,9 +10620,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_fun_after_exp_or = -# 1716 "parser_cocci_menhir.mly" +# 1717 "parser_cocci_menhir.mly" ([]) -# 10625 "parser_cocci_menhir.ml" +# 10626 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10649,9 +10650,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fun_after_exp_or = -# 1717 "parser_cocci_menhir.mly" +# 1718 "parser_cocci_menhir.mly" (_1::_2) -# 10655 "parser_cocci_menhir.ml" +# 10656 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10666,9 +10667,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_fun_after_stm = -# 1695 "parser_cocci_menhir.mly" +# 1696 "parser_cocci_menhir.mly" ([]) -# 10672 "parser_cocci_menhir.ml" +# 10673 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10696,9 +10697,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fun_after_stm = -# 1696 "parser_cocci_menhir.mly" +# 1697 "parser_cocci_menhir.mly" (_1::_2) -# 10702 "parser_cocci_menhir.ml" +# 10703 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10726,9 +10727,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_fun_after_stm = -# 1697 "parser_cocci_menhir.mly" +# 1698 "parser_cocci_menhir.mly" (_1@_2) -# 10732 "parser_cocci_menhir.ml" +# 10733 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10750,9 +10751,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_fun_start = -# 1692 "parser_cocci_menhir.mly" +# 1693 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DOTS(_1)) ) -# 10756 "parser_cocci_menhir.ml" +# 10757 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10774,9 +10775,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_func_ident = -# 1496 "parser_cocci_menhir.mly" +# 1497 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) ) -# 10780 "parser_cocci_menhir.ml" +# 10781 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10797,15 +10798,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 61 "parser_cocci_menhir.mly" (Parse_aux.idinfo) -# 10801 "parser_cocci_menhir.ml" +# 10802 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_func_ident = -# 1498 "parser_cocci_menhir.mly" +# 1499 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,clt) = _1 in Ast0.wrap(Ast0.MetaId(P.clt2mcode nm clt,constraints,pure)) ) -# 10809 "parser_cocci_menhir.ml" +# 10810 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10826,15 +10827,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 61 "parser_cocci_menhir.mly" (Parse_aux.idinfo) -# 10830 "parser_cocci_menhir.ml" +# 10831 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_func_ident = -# 1501 "parser_cocci_menhir.mly" +# 1502 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,clt) = _1 in Ast0.wrap(Ast0.MetaFunc(P.clt2mcode nm clt,constraints,pure)) ) -# 10838 "parser_cocci_menhir.ml" +# 10839 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10855,16 +10856,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 61 "parser_cocci_menhir.mly" (Parse_aux.idinfo) -# 10859 "parser_cocci_menhir.ml" +# 10860 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_func_ident = -# 1504 "parser_cocci_menhir.mly" +# 1505 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,clt) = _1 in Ast0.wrap (Ast0.MetaLocalFunc(P.clt2mcode nm clt,constraints,pure)) ) -# 10868 "parser_cocci_menhir.ml" +# 10869 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -10924,38 +10925,38 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let rb : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 10928 "parser_cocci_menhir.ml" +# 10929 "parser_cocci_menhir.ml" ) = Obj.magic rb in let b : 'tv_fun_start = Obj.magic b in let lb : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 10934 "parser_cocci_menhir.ml" +# 10935 "parser_cocci_menhir.ml" ) = Obj.magic lb in let rp : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 10939 "parser_cocci_menhir.ml" +# 10940 "parser_cocci_menhir.ml" ) = Obj.magic rp in let d : 'tv_decl_list_decl_ = Obj.magic d in let lp : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 10945 "parser_cocci_menhir.ml" +# 10946 "parser_cocci_menhir.ml" ) = Obj.magic lp in let i : 'tv_func_ident = Obj.magic i in let f : 'tv_fninfo = Obj.magic f in let _startpos = _startpos_f_ in let _endpos = _endpos_rb_ in let _v : 'tv_fundecl = -# 768 "parser_cocci_menhir.mly" +# 769 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.FunDecl((Ast0.default_info(),Ast0.context_befaft()), f, i, P.clt2mcode "(" lp, d, P.clt2mcode ")" rp, P.clt2mcode "{" lb, b, P.clt2mcode "}" rb)) ) -# 10959 "parser_cocci_menhir.ml" +# 10960 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11001,18 +11002,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pt : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 11005 "parser_cocci_menhir.ml" +# 11006 "parser_cocci_menhir.ml" ) = Obj.magic pt in let rp : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 11010 "parser_cocci_menhir.ml" +# 11011 "parser_cocci_menhir.ml" ) = Obj.magic rp in let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in let lp : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 11016 "parser_cocci_menhir.ml" +# 11017 "parser_cocci_menhir.ml" ) = Obj.magic lp in let id : 'tv_func_ident = Obj.magic id in let t : 'tv_ctype = Obj.magic t in @@ -11022,11 +11023,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 11026 "parser_cocci_menhir.ml" +# 11027 "parser_cocci_menhir.ml" in -# 745 "parser_cocci_menhir.mly" +# 746 "parser_cocci_menhir.mly" ( Ast0.wrap (Ast0.UnInit (s, @@ -11034,7 +11035,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (Ast0.FunctionType(Some t, P.clt2mcode "(" lp, d, P.clt2mcode ")" rp)), id, P.clt2mcode ";" pt)) ) -# 11038 "parser_cocci_menhir.ml" +# 11039 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11085,18 +11086,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pt : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 11089 "parser_cocci_menhir.ml" +# 11090 "parser_cocci_menhir.ml" ) = Obj.magic pt in let rp : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 11094 "parser_cocci_menhir.ml" +# 11095 "parser_cocci_menhir.ml" ) = Obj.magic rp in let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in let lp : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 11100 "parser_cocci_menhir.ml" +# 11101 "parser_cocci_menhir.ml" ) = Obj.magic lp in let id : 'tv_func_ident = Obj.magic id in let t : 'tv_ctype = Obj.magic t in @@ -11108,11 +11109,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 11112 "parser_cocci_menhir.ml" +# 11113 "parser_cocci_menhir.ml" in -# 745 "parser_cocci_menhir.mly" +# 746 "parser_cocci_menhir.mly" ( Ast0.wrap (Ast0.UnInit (s, @@ -11120,7 +11121,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (Ast0.FunctionType(Some t, P.clt2mcode "(" lp, d, P.clt2mcode ")" rp)), id, P.clt2mcode ";" pt)) ) -# 11124 "parser_cocci_menhir.ml" +# 11125 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11166,24 +11167,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pt : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 11170 "parser_cocci_menhir.ml" +# 11171 "parser_cocci_menhir.ml" ) = Obj.magic pt in let rp : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 11175 "parser_cocci_menhir.ml" +# 11176 "parser_cocci_menhir.ml" ) = Obj.magic rp in let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in let lp : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 11181 "parser_cocci_menhir.ml" +# 11182 "parser_cocci_menhir.ml" ) = Obj.magic lp in let id : 'tv_func_ident = Obj.magic id in let t : ( # 50 "parser_cocci_menhir.mly" (Data.clt) -# 11187 "parser_cocci_menhir.ml" +# 11188 "parser_cocci_menhir.ml" ) = Obj.magic t in let _startpos = _startpos_t_ in let _endpos = _endpos_pt_ in @@ -11191,11 +11192,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 11195 "parser_cocci_menhir.ml" +# 11196 "parser_cocci_menhir.ml" in -# 754 "parser_cocci_menhir.mly" +# 755 "parser_cocci_menhir.mly" ( let t = Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" t])) in Ast0.wrap (Ast0.UnInit @@ -11204,7 +11205,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (Ast0.FunctionType(Some t, P.clt2mcode "(" lp, d, P.clt2mcode ")" rp)), id, P.clt2mcode ";" pt)) ) -# 11208 "parser_cocci_menhir.ml" +# 11209 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11255,24 +11256,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pt : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 11259 "parser_cocci_menhir.ml" +# 11260 "parser_cocci_menhir.ml" ) = Obj.magic pt in let rp : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 11264 "parser_cocci_menhir.ml" +# 11265 "parser_cocci_menhir.ml" ) = Obj.magic rp in let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in let lp : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 11270 "parser_cocci_menhir.ml" +# 11271 "parser_cocci_menhir.ml" ) = Obj.magic lp in let id : 'tv_func_ident = Obj.magic id in let t : ( # 50 "parser_cocci_menhir.mly" (Data.clt) -# 11276 "parser_cocci_menhir.ml" +# 11277 "parser_cocci_menhir.ml" ) = Obj.magic t in let x0 : 'tv_storage = Obj.magic x0 in let _startpos = _startpos_x0_ in @@ -11282,11 +11283,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 11286 "parser_cocci_menhir.ml" +# 11287 "parser_cocci_menhir.ml" in -# 754 "parser_cocci_menhir.mly" +# 755 "parser_cocci_menhir.mly" ( let t = Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" t])) in Ast0.wrap (Ast0.UnInit @@ -11295,7 +11296,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (Ast0.FunctionType(Some t, P.clt2mcode "(" lp, d, P.clt2mcode ")" rp)), id, P.clt2mcode ";" pt)) ) -# 11299 "parser_cocci_menhir.ml" +# 11300 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11316,7 +11317,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let r0 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 11320 "parser_cocci_menhir.ml" +# 11321 "parser_cocci_menhir.ml" ) = Obj.magic r0 in let _startpos = _startpos_r0_ in let _endpos = _endpos_r0_ in @@ -11325,13 +11326,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 589 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) ) -# 11329 "parser_cocci_menhir.ml" +# 11330 "parser_cocci_menhir.ml" in # 513 "parser_cocci_menhir.mly" ( q None ) -# 11335 "parser_cocci_menhir.ml" +# 11336 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11352,7 +11353,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let r0 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 11356 "parser_cocci_menhir.ml" +# 11357 "parser_cocci_menhir.ml" ) = Obj.magic r0 in let _startpos = _startpos_r0_ in let _endpos = _endpos_r0_ in @@ -11361,13 +11362,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 591 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) ) -# 11365 "parser_cocci_menhir.ml" +# 11366 "parser_cocci_menhir.ml" in # 513 "parser_cocci_menhir.mly" ( q None ) -# 11371 "parser_cocci_menhir.ml" +# 11372 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11391,7 +11392,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_generic_ctype = # 514 "parser_cocci_menhir.mly" ( _1 ) -# 11395 "parser_cocci_menhir.ml" +# 11396 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11417,12 +11418,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11421 "parser_cocci_menhir.ml" +# 11422 "parser_cocci_menhir.ml" ) = Obj.magic ty in let r00 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 11426 "parser_cocci_menhir.ml" +# 11427 "parser_cocci_menhir.ml" ) = Obj.magic r00 in let _startpos = _startpos_r00_ in let _endpos = _endpos_ty_ in @@ -11433,19 +11434,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 589 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) ) -# 11437 "parser_cocci_menhir.ml" +# 11438 "parser_cocci_menhir.ml" in # 594 "parser_cocci_menhir.mly" ( function x -> s (Some x) ) -# 11443 "parser_cocci_menhir.ml" +# 11444 "parser_cocci_menhir.ml" in # 466 "parser_cocci_menhir.mly" ( q (Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty]))) ) -# 11449 "parser_cocci_menhir.ml" +# 11450 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11471,12 +11472,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11475 "parser_cocci_menhir.ml" +# 11476 "parser_cocci_menhir.ml" ) = Obj.magic ty in let r00 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 11480 "parser_cocci_menhir.ml" +# 11481 "parser_cocci_menhir.ml" ) = Obj.magic r00 in let _startpos = _startpos_r00_ in let _endpos = _endpos_ty_ in @@ -11487,19 +11488,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 591 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) ) -# 11491 "parser_cocci_menhir.ml" +# 11492 "parser_cocci_menhir.ml" in # 594 "parser_cocci_menhir.mly" ( function x -> s (Some x) ) -# 11497 "parser_cocci_menhir.ml" +# 11498 "parser_cocci_menhir.ml" in # 466 "parser_cocci_menhir.mly" ( q (Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty]))) ) -# 11503 "parser_cocci_menhir.ml" +# 11504 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11520,7 +11521,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11524 "parser_cocci_menhir.ml" +# 11525 "parser_cocci_menhir.ml" ) = Obj.magic ty in let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in @@ -11528,13 +11529,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 595 "parser_cocci_menhir.mly" ( function x -> x ) -# 11532 "parser_cocci_menhir.ml" +# 11533 "parser_cocci_menhir.ml" in # 466 "parser_cocci_menhir.mly" ( q (Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty]))) ) -# 11538 "parser_cocci_menhir.ml" +# 11539 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11560,12 +11561,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11564 "parser_cocci_menhir.ml" +# 11565 "parser_cocci_menhir.ml" ) = Obj.magic ty in let r00 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 11569 "parser_cocci_menhir.ml" +# 11570 "parser_cocci_menhir.ml" ) = Obj.magic r00 in let _startpos = _startpos_r00_ in let _endpos = _endpos_ty_ in @@ -11576,19 +11577,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 589 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) ) -# 11580 "parser_cocci_menhir.ml" +# 11581 "parser_cocci_menhir.ml" in # 594 "parser_cocci_menhir.mly" ( function x -> s (Some x) ) -# 11586 "parser_cocci_menhir.ml" +# 11587 "parser_cocci_menhir.ml" in # 468 "parser_cocci_menhir.mly" ( q (Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])))) -# 11592 "parser_cocci_menhir.ml" +# 11593 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11614,12 +11615,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11618 "parser_cocci_menhir.ml" +# 11619 "parser_cocci_menhir.ml" ) = Obj.magic ty in let r00 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 11623 "parser_cocci_menhir.ml" +# 11624 "parser_cocci_menhir.ml" ) = Obj.magic r00 in let _startpos = _startpos_r00_ in let _endpos = _endpos_ty_ in @@ -11630,19 +11631,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 591 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) ) -# 11634 "parser_cocci_menhir.ml" +# 11635 "parser_cocci_menhir.ml" in # 594 "parser_cocci_menhir.mly" ( function x -> s (Some x) ) -# 11640 "parser_cocci_menhir.ml" +# 11641 "parser_cocci_menhir.ml" in # 468 "parser_cocci_menhir.mly" ( q (Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])))) -# 11646 "parser_cocci_menhir.ml" +# 11647 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11663,7 +11664,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11667 "parser_cocci_menhir.ml" +# 11668 "parser_cocci_menhir.ml" ) = Obj.magic ty in let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in @@ -11671,13 +11672,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 595 "parser_cocci_menhir.mly" ( function x -> x ) -# 11675 "parser_cocci_menhir.ml" +# 11676 "parser_cocci_menhir.ml" in # 468 "parser_cocci_menhir.mly" ( q (Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])))) -# 11681 "parser_cocci_menhir.ml" +# 11682 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11703,12 +11704,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11707 "parser_cocci_menhir.ml" +# 11708 "parser_cocci_menhir.ml" ) = Obj.magic ty in let r00 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 11712 "parser_cocci_menhir.ml" +# 11713 "parser_cocci_menhir.ml" ) = Obj.magic r00 in let _startpos = _startpos_r00_ in let _endpos = _endpos_ty_ in @@ -11719,19 +11720,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 589 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) ) -# 11723 "parser_cocci_menhir.ml" +# 11724 "parser_cocci_menhir.ml" in # 594 "parser_cocci_menhir.mly" ( function x -> s (Some x) ) -# 11729 "parser_cocci_menhir.ml" +# 11730 "parser_cocci_menhir.ml" in # 470 "parser_cocci_menhir.mly" ( q (Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty]))) ) -# 11735 "parser_cocci_menhir.ml" +# 11736 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11757,12 +11758,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11761 "parser_cocci_menhir.ml" +# 11762 "parser_cocci_menhir.ml" ) = Obj.magic ty in let r00 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 11766 "parser_cocci_menhir.ml" +# 11767 "parser_cocci_menhir.ml" ) = Obj.magic r00 in let _startpos = _startpos_r00_ in let _endpos = _endpos_ty_ in @@ -11773,19 +11774,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 591 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) ) -# 11777 "parser_cocci_menhir.ml" +# 11778 "parser_cocci_menhir.ml" in # 594 "parser_cocci_menhir.mly" ( function x -> s (Some x) ) -# 11783 "parser_cocci_menhir.ml" +# 11784 "parser_cocci_menhir.ml" in # 470 "parser_cocci_menhir.mly" ( q (Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty]))) ) -# 11789 "parser_cocci_menhir.ml" +# 11790 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11806,7 +11807,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11810 "parser_cocci_menhir.ml" +# 11811 "parser_cocci_menhir.ml" ) = Obj.magic ty in let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in @@ -11814,13 +11815,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 595 "parser_cocci_menhir.mly" ( function x -> x ) -# 11818 "parser_cocci_menhir.ml" +# 11819 "parser_cocci_menhir.ml" in # 470 "parser_cocci_menhir.mly" ( q (Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty]))) ) -# 11824 "parser_cocci_menhir.ml" +# 11825 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11841,14 +11842,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let t : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11845 "parser_cocci_menhir.ml" +# 11846 "parser_cocci_menhir.ml" ) = Obj.magic t in let _startpos = _startpos_t_ in let _endpos = _endpos_t_ in let _v : 'tv_generic_ctype_full = # 472 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.BaseType(Ast.DoubleType,[P.clt2mcode "double" t])) ) -# 11852 "parser_cocci_menhir.ml" +# 11853 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11869,14 +11870,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let t : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11873 "parser_cocci_menhir.ml" +# 11874 "parser_cocci_menhir.ml" ) = Obj.magic t in let _startpos = _startpos_t_ in let _endpos = _endpos_t_ in let _v : 'tv_generic_ctype_full = # 474 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.BaseType(Ast.FloatType,[P.clt2mcode "float" t])) ) -# 11880 "parser_cocci_menhir.ml" +# 11881 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11902,12 +11903,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11906 "parser_cocci_menhir.ml" +# 11907 "parser_cocci_menhir.ml" ) = Obj.magic ty in let r00 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 11911 "parser_cocci_menhir.ml" +# 11912 "parser_cocci_menhir.ml" ) = Obj.magic r00 in let _startpos = _startpos_r00_ in let _endpos = _endpos_ty_ in @@ -11918,19 +11919,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 589 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) ) -# 11922 "parser_cocci_menhir.ml" +# 11923 "parser_cocci_menhir.ml" in # 594 "parser_cocci_menhir.mly" ( function x -> s (Some x) ) -# 11928 "parser_cocci_menhir.ml" +# 11929 "parser_cocci_menhir.ml" in # 476 "parser_cocci_menhir.mly" ( q (Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty]))) ) -# 11934 "parser_cocci_menhir.ml" +# 11935 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -11956,12 +11957,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 11960 "parser_cocci_menhir.ml" +# 11961 "parser_cocci_menhir.ml" ) = Obj.magic ty in let r00 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 11965 "parser_cocci_menhir.ml" +# 11966 "parser_cocci_menhir.ml" ) = Obj.magic r00 in let _startpos = _startpos_r00_ in let _endpos = _endpos_ty_ in @@ -11972,19 +11973,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 591 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) ) -# 11976 "parser_cocci_menhir.ml" +# 11977 "parser_cocci_menhir.ml" in # 594 "parser_cocci_menhir.mly" ( function x -> s (Some x) ) -# 11982 "parser_cocci_menhir.ml" +# 11983 "parser_cocci_menhir.ml" in # 476 "parser_cocci_menhir.mly" ( q (Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty]))) ) -# 11988 "parser_cocci_menhir.ml" +# 11989 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12005,7 +12006,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 12009 "parser_cocci_menhir.ml" +# 12010 "parser_cocci_menhir.ml" ) = Obj.magic ty in let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in @@ -12013,13 +12014,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 595 "parser_cocci_menhir.mly" ( function x -> x ) -# 12017 "parser_cocci_menhir.ml" +# 12018 "parser_cocci_menhir.ml" in # 476 "parser_cocci_menhir.mly" ( q (Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty]))) ) -# 12023 "parser_cocci_menhir.ml" +# 12024 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12050,17 +12051,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty1 : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 12054 "parser_cocci_menhir.ml" +# 12055 "parser_cocci_menhir.ml" ) = Obj.magic ty1 in let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 12059 "parser_cocci_menhir.ml" +# 12060 "parser_cocci_menhir.ml" ) = Obj.magic ty in let r00 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 12064 "parser_cocci_menhir.ml" +# 12065 "parser_cocci_menhir.ml" ) = Obj.magic r00 in let _startpos = _startpos_r00_ in let _endpos = _endpos_ty1_ in @@ -12071,13 +12072,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 589 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) ) -# 12075 "parser_cocci_menhir.ml" +# 12076 "parser_cocci_menhir.ml" in # 594 "parser_cocci_menhir.mly" ( function x -> s (Some x) ) -# 12081 "parser_cocci_menhir.ml" +# 12082 "parser_cocci_menhir.ml" in @@ -12086,7 +12087,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (Ast0.BaseType (Ast.LongLongType, [P.clt2mcode "long" ty;P.clt2mcode "long" ty1]))) ) -# 12090 "parser_cocci_menhir.ml" +# 12091 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12117,17 +12118,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty1 : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 12121 "parser_cocci_menhir.ml" +# 12122 "parser_cocci_menhir.ml" ) = Obj.magic ty1 in let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 12126 "parser_cocci_menhir.ml" +# 12127 "parser_cocci_menhir.ml" ) = Obj.magic ty in let r00 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 12131 "parser_cocci_menhir.ml" +# 12132 "parser_cocci_menhir.ml" ) = Obj.magic r00 in let _startpos = _startpos_r00_ in let _endpos = _endpos_ty1_ in @@ -12138,13 +12139,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 591 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) ) -# 12142 "parser_cocci_menhir.ml" +# 12143 "parser_cocci_menhir.ml" in # 594 "parser_cocci_menhir.mly" ( function x -> s (Some x) ) -# 12148 "parser_cocci_menhir.ml" +# 12149 "parser_cocci_menhir.ml" in @@ -12153,7 +12154,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (Ast0.BaseType (Ast.LongLongType, [P.clt2mcode "long" ty;P.clt2mcode "long" ty1]))) ) -# 12157 "parser_cocci_menhir.ml" +# 12158 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12179,12 +12180,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty1 : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 12183 "parser_cocci_menhir.ml" +# 12184 "parser_cocci_menhir.ml" ) = Obj.magic ty1 in let ty : ( # 49 "parser_cocci_menhir.mly" (Data.clt) -# 12188 "parser_cocci_menhir.ml" +# 12189 "parser_cocci_menhir.ml" ) = Obj.magic ty in let _startpos = _startpos_ty_ in let _endpos = _endpos_ty1_ in @@ -12192,7 +12193,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 595 "parser_cocci_menhir.mly" ( function x -> x ) -# 12196 "parser_cocci_menhir.ml" +# 12197 "parser_cocci_menhir.ml" in @@ -12201,7 +12202,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (Ast0.BaseType (Ast.LongLongType, [P.clt2mcode "long" ty;P.clt2mcode "long" ty1]))) ) -# 12205 "parser_cocci_menhir.ml" +# 12206 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12228,14 +12229,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let s : ( # 50 "parser_cocci_menhir.mly" (Data.clt) -# 12232 "parser_cocci_menhir.ml" +# 12233 "parser_cocci_menhir.ml" ) = Obj.magic s in let _startpos = _startpos_s_ in let _endpos = _endpos_i_ in let _v : 'tv_generic_ctype_full = # 483 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, i)) ) -# 12239 "parser_cocci_menhir.ml" +# 12240 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12265,7 +12266,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_generic_ctype_full = # 485 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.StructUnionName(s, Some i)) ) -# 12269 "parser_cocci_menhir.ml" +# 12270 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12301,13 +12302,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let r : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 12305 "parser_cocci_menhir.ml" +# 12306 "parser_cocci_menhir.ml" ) = Obj.magic r in let d : 'tv_struct_decl_list = Obj.magic d in let l : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 12311 "parser_cocci_menhir.ml" +# 12312 "parser_cocci_menhir.ml" ) = Obj.magic l in let s : 'tv_struct_or_union = Obj.magic s in let _startpos = _startpos_s_ in @@ -12316,7 +12317,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 12320 "parser_cocci_menhir.ml" +# 12321 "parser_cocci_menhir.ml" in @@ -12326,7 +12327,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct Ast0.wrap(Ast0.StructUnionDef(Ast0.wrap(Ast0.StructUnionName(s, i)), P.clt2mcode "{" l, d, P.clt2mcode "}" r)) ) -# 12330 "parser_cocci_menhir.ml" +# 12331 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12367,13 +12368,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let r : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 12371 "parser_cocci_menhir.ml" +# 12372 "parser_cocci_menhir.ml" ) = Obj.magic r in let d : 'tv_struct_decl_list = Obj.magic d in let l : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 12377 "parser_cocci_menhir.ml" +# 12378 "parser_cocci_menhir.ml" ) = Obj.magic l in let x0 : 'tv_ident = Obj.magic x0 in let s : 'tv_struct_or_union = Obj.magic s in @@ -12384,7 +12385,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 12388 "parser_cocci_menhir.ml" +# 12389 "parser_cocci_menhir.ml" in @@ -12394,7 +12395,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct Ast0.wrap(Ast0.StructUnionDef(Ast0.wrap(Ast0.StructUnionName(s, i)), P.clt2mcode "{" l, d, P.clt2mcode "}" r)) ) -# 12398 "parser_cocci_menhir.ml" +# 12399 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12430,18 +12431,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let r : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 12434 "parser_cocci_menhir.ml" +# 12435 "parser_cocci_menhir.ml" ) = Obj.magic r in let d : 'tv_struct_decl_list = Obj.magic d in let l : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 12440 "parser_cocci_menhir.ml" +# 12441 "parser_cocci_menhir.ml" ) = Obj.magic l in let s : ( # 64 "parser_cocci_menhir.mly" (Parse_aux.info) -# 12445 "parser_cocci_menhir.ml" +# 12446 "parser_cocci_menhir.ml" ) = Obj.magic s in let _startpos = _startpos_s_ in let _endpos = _endpos_r_ in @@ -12452,7 +12453,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) in Ast0.wrap (Ast0.StructUnionDef(ty,P.clt2mcode "{" l,d,P.clt2mcode "}" r)) ) -# 12456 "parser_cocci_menhir.ml" +# 12457 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12482,12 +12483,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let p : ( # 59 "parser_cocci_menhir.mly" (string * Data.clt) -# 12486 "parser_cocci_menhir.ml" +# 12487 "parser_cocci_menhir.ml" ) = Obj.magic p in let r : ( # 47 "parser_cocci_menhir.mly" (string) -# 12491 "parser_cocci_menhir.ml" +# 12492 "parser_cocci_menhir.ml" ) = Obj.magic r in let _startpos = _startpos_r_ in let _endpos = _endpos_p_ in @@ -12499,7 +12500,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _ = P.check_meta(Ast.MetaTypeDecl(Ast.NONE,nm)) in Ast0.wrap(Ast0.MetaType(P.clt2mcode nm (P.id2clt p), Ast0.Impure (*will be ignored*))) ) -# 12503 "parser_cocci_menhir.ml" +# 12504 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12520,14 +12521,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let p : ( # 59 "parser_cocci_menhir.mly" (string * Data.clt) -# 12524 "parser_cocci_menhir.ml" +# 12525 "parser_cocci_menhir.ml" ) = Obj.magic p in let _startpos = _startpos_p_ in let _endpos = _endpos_p_ in let _v : 'tv_generic_ctype_full = # 507 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.TypeName(P.id2mcode p)) ) -# 12531 "parser_cocci_menhir.ml" +# 12532 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12553,12 +12554,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let p : ( # 64 "parser_cocci_menhir.mly" (Parse_aux.info) -# 12557 "parser_cocci_menhir.ml" +# 12558 "parser_cocci_menhir.ml" ) = Obj.magic p in let r00 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 12562 "parser_cocci_menhir.ml" +# 12563 "parser_cocci_menhir.ml" ) = Obj.magic r00 in let _startpos = _startpos_r00_ in let _endpos = _endpos_p_ in @@ -12569,20 +12570,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 589 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) ) -# 12573 "parser_cocci_menhir.ml" +# 12574 "parser_cocci_menhir.ml" in # 594 "parser_cocci_menhir.mly" ( function x -> s (Some x) ) -# 12579 "parser_cocci_menhir.ml" +# 12580 "parser_cocci_menhir.ml" in # 509 "parser_cocci_menhir.mly" ( let (nm,pure,clt) = p in q (Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure))) ) -# 12586 "parser_cocci_menhir.ml" +# 12587 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12608,12 +12609,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let p : ( # 64 "parser_cocci_menhir.mly" (Parse_aux.info) -# 12612 "parser_cocci_menhir.ml" +# 12613 "parser_cocci_menhir.ml" ) = Obj.magic p in let r00 : ( # 51 "parser_cocci_menhir.mly" (Data.clt) -# 12617 "parser_cocci_menhir.ml" +# 12618 "parser_cocci_menhir.ml" ) = Obj.magic r00 in let _startpos = _startpos_r00_ in let _endpos = _endpos_p_ in @@ -12624,20 +12625,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 591 "parser_cocci_menhir.mly" ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) ) -# 12628 "parser_cocci_menhir.ml" +# 12629 "parser_cocci_menhir.ml" in # 594 "parser_cocci_menhir.mly" ( function x -> s (Some x) ) -# 12634 "parser_cocci_menhir.ml" +# 12635 "parser_cocci_menhir.ml" in # 509 "parser_cocci_menhir.mly" ( let (nm,pure,clt) = p in q (Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure))) ) -# 12641 "parser_cocci_menhir.ml" +# 12642 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12658,7 +12659,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let p : ( # 64 "parser_cocci_menhir.mly" (Parse_aux.info) -# 12662 "parser_cocci_menhir.ml" +# 12663 "parser_cocci_menhir.ml" ) = Obj.magic p in let _startpos = _startpos_p_ in let _endpos = _endpos_p_ in @@ -12666,14 +12667,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 595 "parser_cocci_menhir.mly" ( function x -> x ) -# 12670 "parser_cocci_menhir.ml" +# 12671 "parser_cocci_menhir.ml" in # 509 "parser_cocci_menhir.mly" ( let (nm,pure,clt) = p in q (Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure))) ) -# 12677 "parser_cocci_menhir.ml" +# 12678 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12695,9 +12696,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_ident = -# 1509 "parser_cocci_menhir.mly" +# 1510 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) ) -# 12701 "parser_cocci_menhir.ml" +# 12702 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12718,15 +12719,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 61 "parser_cocci_menhir.mly" (Parse_aux.idinfo) -# 12722 "parser_cocci_menhir.ml" +# 12723 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_ident = -# 1511 "parser_cocci_menhir.mly" +# 1512 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,clt) = _1 in Ast0.wrap(Ast0.MetaId(P.clt2mcode nm clt,constraints,pure)) ) -# 12730 "parser_cocci_menhir.ml" +# 12731 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12748,9 +12749,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_i_ in let _endpos = _endpos_i_ in let _v : 'tv_ident_or_const = -# 1463 "parser_cocci_menhir.mly" +# 1464 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Ident(Ast0.wrap(Ast0.Id(P.id2mcode i)))) ) -# 12754 "parser_cocci_menhir.ml" +# 12755 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12771,15 +12772,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 12775 "parser_cocci_menhir.ml" +# 12776 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_ident_or_const = -# 1465 "parser_cocci_menhir.mly" +# 1466 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) ) -# 12783 "parser_cocci_menhir.ml" +# 12784 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12804,14 +12805,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 12808 "parser_cocci_menhir.ml" +# 12809 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_incl = # 257 "parser_cocci_menhir.mly" ( Common.Left(P.id2name _2) ) -# 12815 "parser_cocci_menhir.ml" +# 12816 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12836,14 +12837,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 79 "parser_cocci_menhir.mly" (string) -# 12840 "parser_cocci_menhir.ml" +# 12841 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_incl = # 258 "parser_cocci_menhir.mly" ( Common.Right _2 ) -# 12847 "parser_cocci_menhir.ml" +# 12848 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12871,11 +12872,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 146 "parser_cocci_menhir.mly" ((string,string) Common.either list) -# 12875 "parser_cocci_menhir.ml" +# 12876 "parser_cocci_menhir.ml" ) = # 253 "parser_cocci_menhir.mly" ( _1 ) -# 12879 "parser_cocci_menhir.ml" +# 12880 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12903,11 +12904,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 146 "parser_cocci_menhir.mly" ((string,string) Common.either list) -# 12907 "parser_cocci_menhir.ml" +# 12908 "parser_cocci_menhir.ml" ) = # 254 "parser_cocci_menhir.mly" ( _1 ) -# 12911 "parser_cocci_menhir.ml" +# 12912 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12928,7 +12929,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 80 "parser_cocci_menhir.mly" (string * Data.clt) -# 12932 "parser_cocci_menhir.ml" +# 12933 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in @@ -12943,7 +12944,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct P.clt2mcode (Ast.Local (Parse_aux.str2inc (P.id2name _1))) (P.drop_bef clt))) ) -# 12947 "parser_cocci_menhir.ml" +# 12948 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -12964,7 +12965,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 80 "parser_cocci_menhir.mly" (string * Data.clt) -# 12968 "parser_cocci_menhir.ml" +# 12969 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in @@ -12979,7 +12980,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct P.clt2mcode (Ast.NonLocal (Parse_aux.str2inc (P.id2name _1))) (P.drop_bef clt))) ) -# 12983 "parser_cocci_menhir.ml" +# 12984 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13014,7 +13015,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 658 "parser_cocci_menhir.mly" ( let ty = Ast0.wrap(Ast0.TopExp(Ast0.wrap(Ast0.TypeExp(t)))) in d (Ast0.wrap(Ast0.DOTS([ty]))) ) -# 13018 "parser_cocci_menhir.ml" +# 13019 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13056,7 +13057,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct | _ -> b) | _ -> b in _1 (Ast0.wrap(Ast0.DOTS(body))) ) -# 13060 "parser_cocci_menhir.ml" +# 13061 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13078,9 +13079,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_initialize = -# 1074 "parser_cocci_menhir.mly" +# 1075 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.InitExpr(_1)) ) -# 13084 "parser_cocci_menhir.ml" +# 13085 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13111,20 +13112,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 13115 "parser_cocci_menhir.ml" +# 13116 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_initialize_list = Obj.magic _2 in let _1 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 13121 "parser_cocci_menhir.ml" +# 13122 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_initialize = -# 1076 "parser_cocci_menhir.mly" +# 1077 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.InitList(P.clt2mcode "{" _1,_2,P.clt2mcode "}" _3)) ) -# 13128 "parser_cocci_menhir.ml" +# 13129 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13150,21 +13151,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 13154 "parser_cocci_menhir.ml" +# 13155 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 13159 "parser_cocci_menhir.ml" +# 13160 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_initialize = -# 1078 "parser_cocci_menhir.mly" +# 1079 "parser_cocci_menhir.mly" ( Ast0.wrap (Ast0.InitList(P.clt2mcode "{" _1,Ast0.wrap(Ast0.DOTS []), P.clt2mcode "}" _2)) ) -# 13168 "parser_cocci_menhir.ml" +# 13169 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13185,15 +13186,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 65 "parser_cocci_menhir.mly" (Parse_aux.info) -# 13189 "parser_cocci_menhir.ml" +# 13190 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_initialize = -# 1082 "parser_cocci_menhir.mly" +# 1083 "parser_cocci_menhir.mly" (let (nm,pure,clt) = _1 in Ast0.wrap(Ast0.MetaInit(P.clt2mcode nm clt,pure)) ) -# 13197 "parser_cocci_menhir.ml" +# 13198 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13215,9 +13216,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_initialize2 = -# 1088 "parser_cocci_menhir.mly" +# 1089 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.InitExpr(_1)) ) -# 13221 "parser_cocci_menhir.ml" +# 13222 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13248,20 +13249,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 13252 "parser_cocci_menhir.ml" +# 13253 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_initialize_list = Obj.magic _2 in let _1 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 13258 "parser_cocci_menhir.ml" +# 13259 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_initialize2 = -# 1090 "parser_cocci_menhir.mly" +# 1091 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.InitList(P.clt2mcode "{" _1,_2,P.clt2mcode "}" _3)) ) -# 13265 "parser_cocci_menhir.ml" +# 13266 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13287,21 +13288,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 13291 "parser_cocci_menhir.ml" +# 13292 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 13296 "parser_cocci_menhir.ml" +# 13297 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_initialize2 = -# 1092 "parser_cocci_menhir.mly" +# 1093 "parser_cocci_menhir.mly" ( Ast0.wrap (Ast0.InitList(P.clt2mcode "{" _1,Ast0.wrap(Ast0.DOTS []), P.clt2mcode "}" _2)) ) -# 13305 "parser_cocci_menhir.ml" +# 13306 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13333,15 +13334,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 13337 "parser_cocci_menhir.ml" +# 13338 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_list_designator_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_initialize2 = -# 1097 "parser_cocci_menhir.mly" +# 1098 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.InitGccExt(_1,P.clt2mcode "=" _2,_3)) ) -# 13345 "parser_cocci_menhir.ml" +# 13346 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13373,15 +13374,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 13377 "parser_cocci_menhir.ml" +# 13378 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_ident = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_initialize2 = -# 1099 "parser_cocci_menhir.mly" +# 1100 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.InitGccName(_1,P.clt2mcode ":" _2,_3)) ) -# 13385 "parser_cocci_menhir.ml" +# 13386 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13403,9 +13404,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_initialize_list = -# 1111 "parser_cocci_menhir.mly" +# 1112 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DOTS(_1)) ) -# 13409 "parser_cocci_menhir.ml" +# 13410 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13431,15 +13432,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 13435 "parser_cocci_menhir.ml" +# 13436 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_initialize2 = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_initialize_list_start = -# 1114 "parser_cocci_menhir.mly" +# 1115 "parser_cocci_menhir.mly" ( [_1;Ast0.wrap(Ast0.IComma(P.clt2mcode "," _2))] ) -# 13443 "parser_cocci_menhir.ml" +# 13444 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13471,15 +13472,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 13475 "parser_cocci_menhir.ml" +# 13476 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_initialize2 = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_initialize_list_start = -# 1116 "parser_cocci_menhir.mly" +# 1117 "parser_cocci_menhir.mly" ( _1::Ast0.wrap(Ast0.IComma(P.clt2mcode "," _2))::_3 ) -# 13483 "parser_cocci_menhir.ml" +# 13484 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13507,10 +13508,10 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_d_ in let _endpos = _endpos_r_ in let _v : 'tv_initialize_list_start = -# 1119 "parser_cocci_menhir.mly" +# 1120 "parser_cocci_menhir.mly" ( (P.mkidots "..." d):: (List.concat(List.map (function x -> x (P.mkidots "...")) r)) ) -# 13514 "parser_cocci_menhir.ml" +# 13515 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13530,9 +13531,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_invalid = -# 1212 "parser_cocci_menhir.mly" +# 1213 "parser_cocci_menhir.mly" ( raise (Semantic_cocci.Semantic "not matchable") ) -# 13536 "parser_cocci_menhir.ml" +# 13537 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13549,7 +13550,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_is_expression = # 249 "parser_cocci_menhir.mly" ( false ) -# 13553 "parser_cocci_menhir.ml" +# 13554 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13571,7 +13572,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_is_expression = # 250 "parser_cocci_menhir.mly" ( true ) -# 13575 "parser_cocci_menhir.ml" +# 13576 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13597,9 +13598,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_t_ in let _v : 'tv_iso_ctype_ = -# 1860 "parser_cocci_menhir.mly" +# 1866 "parser_cocci_menhir.mly" ( Common.Left t ) -# 13603 "parser_cocci_menhir.ml" +# 13604 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13625,9 +13626,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_t_ in let _v : 'tv_iso_ctype_ = -# 1861 "parser_cocci_menhir.mly" +# 1867 "parser_cocci_menhir.mly" ( Common.Right t ) -# 13631 "parser_cocci_menhir.ml" +# 13632 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13653,9 +13654,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_t_ in let _v : 'tv_iso_decl_var_ = -# 1860 "parser_cocci_menhir.mly" +# 1866 "parser_cocci_menhir.mly" ( Common.Left t ) -# 13659 "parser_cocci_menhir.ml" +# 13660 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13681,9 +13682,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_t_ in let _v : 'tv_iso_decl_var_ = -# 1861 "parser_cocci_menhir.mly" +# 1867 "parser_cocci_menhir.mly" ( Common.Right t ) -# 13687 "parser_cocci_menhir.ml" +# 13688 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13709,9 +13710,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_t_ in let _v : 'tv_iso_dexpr_ = -# 1860 "parser_cocci_menhir.mly" +# 1866 "parser_cocci_menhir.mly" ( Common.Left t ) -# 13715 "parser_cocci_menhir.ml" +# 13716 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13737,9 +13738,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_t_ in let _v : 'tv_iso_dexpr_ = -# 1861 "parser_cocci_menhir.mly" +# 1867 "parser_cocci_menhir.mly" ( Common.Right t ) -# 13743 "parser_cocci_menhir.ml" +# 13744 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13765,9 +13766,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_t_ in let _v : 'tv_iso_nest_start_ = -# 1860 "parser_cocci_menhir.mly" +# 1866 "parser_cocci_menhir.mly" ( Common.Left t ) -# 13771 "parser_cocci_menhir.ml" +# 13772 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13793,9 +13794,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_t_ in let _v : 'tv_iso_nest_start_ = -# 1861 "parser_cocci_menhir.mly" +# 1867 "parser_cocci_menhir.mly" ( Common.Right t ) -# 13799 "parser_cocci_menhir.ml" +# 13800 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13821,9 +13822,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_t_ in let _v : 'tv_iso_single_statement_ = -# 1860 "parser_cocci_menhir.mly" +# 1866 "parser_cocci_menhir.mly" ( Common.Left t ) -# 13827 "parser_cocci_menhir.ml" +# 13828 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13849,9 +13850,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_t_ in let _v : 'tv_iso_single_statement_ = -# 1861 "parser_cocci_menhir.mly" +# 1867 "parser_cocci_menhir.mly" ( Common.Right t ) -# 13855 "parser_cocci_menhir.ml" +# 13856 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13889,11 +13890,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 162 "parser_cocci_menhir.mly" (Ast0_cocci.anything list list) -# 13893 "parser_cocci_menhir.ml" +# 13894 "parser_cocci_menhir.ml" ) = -# 1832 "parser_cocci_menhir.mly" +# 1838 "parser_cocci_menhir.mly" ( P.iso_adjust (function x -> Ast0.ExprTag x) e1 el ) -# 13897 "parser_cocci_menhir.ml" +# 13898 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13931,11 +13932,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 162 "parser_cocci_menhir.mly" (Ast0_cocci.anything list list) -# 13935 "parser_cocci_menhir.ml" +# 13936 "parser_cocci_menhir.ml" ) = -# 1834 "parser_cocci_menhir.mly" +# 1840 "parser_cocci_menhir.mly" ( P.iso_adjust (function x -> Ast0.ArgExprTag x) e1 el ) -# 13939 "parser_cocci_menhir.ml" +# 13940 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -13973,11 +13974,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 162 "parser_cocci_menhir.mly" (Ast0_cocci.anything list list) -# 13977 "parser_cocci_menhir.ml" +# 13978 "parser_cocci_menhir.ml" ) = -# 1836 "parser_cocci_menhir.mly" +# 1842 "parser_cocci_menhir.mly" ( P.iso_adjust (function x -> Ast0.TestExprTag x) e1 el ) -# 13981 "parser_cocci_menhir.ml" +# 13982 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14015,11 +14016,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 162 "parser_cocci_menhir.mly" (Ast0_cocci.anything list list) -# 14019 "parser_cocci_menhir.ml" +# 14020 "parser_cocci_menhir.ml" ) = -# 1838 "parser_cocci_menhir.mly" +# 1844 "parser_cocci_menhir.mly" ( P.iso_adjust (function x -> Ast0.StmtTag x) s1 sl ) -# 14023 "parser_cocci_menhir.ml" +# 14024 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14057,11 +14058,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 162 "parser_cocci_menhir.mly" (Ast0_cocci.anything list list) -# 14061 "parser_cocci_menhir.ml" +# 14062 "parser_cocci_menhir.ml" ) = -# 1840 "parser_cocci_menhir.mly" +# 1846 "parser_cocci_menhir.mly" ( P.iso_adjust (function x -> Ast0.TypeCTag x) t1 tl ) -# 14065 "parser_cocci_menhir.ml" +# 14066 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14099,11 +14100,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 162 "parser_cocci_menhir.mly" (Ast0_cocci.anything list list) -# 14103 "parser_cocci_menhir.ml" +# 14104 "parser_cocci_menhir.ml" ) = -# 1842 "parser_cocci_menhir.mly" +# 1848 "parser_cocci_menhir.mly" ( P.iso_adjust (function x -> Ast0.DotsStmtTag x) e1 el ) -# 14107 "parser_cocci_menhir.ml" +# 14108 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14141,9 +14142,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 162 "parser_cocci_menhir.mly" (Ast0_cocci.anything list list) -# 14145 "parser_cocci_menhir.ml" +# 14146 "parser_cocci_menhir.ml" ) = -# 1844 "parser_cocci_menhir.mly" +# 1850 "parser_cocci_menhir.mly" ( let check_one = function [x] -> x | _ -> @@ -14158,7 +14159,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct | Common.Right x -> Common.Right(check_one x)) dl in P.iso_adjust (function x -> Ast0.DeclTag x) d1 dl ) -# 14162 "parser_cocci_menhir.ml" +# 14163 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14182,11 +14183,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 165 "parser_cocci_menhir.mly" ((Ast_cocci.metavar,Ast_cocci.metavar) Common.either list) -# 14186 "parser_cocci_menhir.ml" +# 14187 "parser_cocci_menhir.ml" ) = # 182 "parser_cocci_menhir.mly" ( m "" ) -# 14190 "parser_cocci_menhir.ml" +# 14191 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14214,11 +14215,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 149 "parser_cocci_menhir.mly" (Ast_cocci.rulename) -# 14218 "parser_cocci_menhir.ml" +# 14219 "parser_cocci_menhir.ml" ) = # 197 "parser_cocci_menhir.mly" ( P.make_iso_rule_name_result (P.id2name nm) ) -# 14222 "parser_cocci_menhir.ml" +# 14223 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14239,14 +14240,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 59 "parser_cocci_menhir.mly" (string * Data.clt) -# 14243 "parser_cocci_menhir.ml" +# 14244 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_iter_ident = -# 1523 "parser_cocci_menhir.mly" +# 1524 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) ) -# 14250 "parser_cocci_menhir.ml" +# 14251 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14267,15 +14268,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 62 "parser_cocci_menhir.mly" (Parse_aux.idinfo) -# 14271 "parser_cocci_menhir.ml" +# 14272 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_iter_ident = -# 1525 "parser_cocci_menhir.mly" +# 1526 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,clt) = _1 in Ast0.wrap(Ast0.MetaId(P.clt2mcode nm clt,constraints,pure)) ) -# 14279 "parser_cocci_menhir.ml" +# 14280 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14292,7 +14293,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_TMul_ = # 114 "standard.mly" ( [] ) -# 14296 "parser_cocci_menhir.ml" +# 14297 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14319,14 +14320,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let x : ( # 99 "parser_cocci_menhir.mly" (Data.clt) -# 14323 "parser_cocci_menhir.ml" +# 14324 "parser_cocci_menhir.ml" ) = Obj.magic x in let _startpos = _startpos_x_ in let _endpos = _endpos_xs_ in let _v : 'tv_list_TMul_ = # 116 "standard.mly" ( x :: xs ) -# 14330 "parser_cocci_menhir.ml" +# 14331 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14343,7 +14344,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_array_dec_ = # 114 "standard.mly" ( [] ) -# 14347 "parser_cocci_menhir.ml" +# 14348 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14373,7 +14374,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_array_dec_ = # 116 "standard.mly" ( x :: xs ) -# 14377 "parser_cocci_menhir.ml" +# 14378 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14390,7 +14391,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_case_line_ = # 114 "standard.mly" ( [] ) -# 14394 "parser_cocci_menhir.ml" +# 14395 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14420,7 +14421,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_case_line_ = # 116 "standard.mly" ( x :: xs ) -# 14424 "parser_cocci_menhir.ml" +# 14425 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14437,7 +14438,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_comma_decls_TEllipsis_decl__ = # 114 "standard.mly" ( [] ) -# 14441 "parser_cocci_menhir.ml" +# 14442 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14467,7 +14468,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_comma_decls_TEllipsis_decl__ = # 116 "standard.mly" ( x :: xs ) -# 14471 "parser_cocci_menhir.ml" +# 14472 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14484,7 +14485,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_comma_decls_TEllipsis_name_opt_decl__ = # 114 "standard.mly" ( [] ) -# 14488 "parser_cocci_menhir.ml" +# 14489 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14514,7 +14515,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_comma_decls_TEllipsis_name_opt_decl__ = # 116 "standard.mly" ( x :: xs ) -# 14518 "parser_cocci_menhir.ml" +# 14519 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14531,7 +14532,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_designator_ = # 114 "standard.mly" ( [] ) -# 14535 "parser_cocci_menhir.ml" +# 14536 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14561,7 +14562,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_designator_ = # 116 "standard.mly" ( x :: xs ) -# 14565 "parser_cocci_menhir.ml" +# 14566 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14578,7 +14579,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_dp_comma_args_TEllipsis__ = # 114 "standard.mly" ( [] ) -# 14582 "parser_cocci_menhir.ml" +# 14583 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14608,7 +14609,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_dp_comma_args_TEllipsis__ = # 116 "standard.mly" ( x :: xs ) -# 14612 "parser_cocci_menhir.ml" +# 14613 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14625,7 +14626,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_incl_ = # 114 "standard.mly" ( [] ) -# 14629 "parser_cocci_menhir.ml" +# 14630 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14655,7 +14656,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_incl_ = # 116 "standard.mly" ( x :: xs ) -# 14659 "parser_cocci_menhir.ml" +# 14660 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14672,7 +14673,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_iso_ctype__ = # 114 "standard.mly" ( [] ) -# 14676 "parser_cocci_menhir.ml" +# 14677 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14702,7 +14703,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_iso_ctype__ = # 116 "standard.mly" ( x :: xs ) -# 14706 "parser_cocci_menhir.ml" +# 14707 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14719,7 +14720,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_iso_decl_var__ = # 114 "standard.mly" ( [] ) -# 14723 "parser_cocci_menhir.ml" +# 14724 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14749,7 +14750,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_iso_decl_var__ = # 116 "standard.mly" ( x :: xs ) -# 14753 "parser_cocci_menhir.ml" +# 14754 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14766,7 +14767,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_iso_dexpr__ = # 114 "standard.mly" ( [] ) -# 14770 "parser_cocci_menhir.ml" +# 14771 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14796,7 +14797,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_iso_dexpr__ = # 116 "standard.mly" ( x :: xs ) -# 14800 "parser_cocci_menhir.ml" +# 14801 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14813,7 +14814,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_iso_nest_start__ = # 114 "standard.mly" ( [] ) -# 14817 "parser_cocci_menhir.ml" +# 14818 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14843,7 +14844,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_iso_nest_start__ = # 116 "standard.mly" ( x :: xs ) -# 14847 "parser_cocci_menhir.ml" +# 14848 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14860,7 +14861,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_iso_single_statement__ = # 114 "standard.mly" ( [] ) -# 14864 "parser_cocci_menhir.ml" +# 14865 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14890,7 +14891,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_iso_single_statement__ = # 116 "standard.mly" ( x :: xs ) -# 14894 "parser_cocci_menhir.ml" +# 14895 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14907,7 +14908,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_mzl_ctype__ = # 114 "standard.mly" ( [] ) -# 14911 "parser_cocci_menhir.ml" +# 14912 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14937,7 +14938,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_mzl_ctype__ = # 116 "standard.mly" ( x :: xs ) -# 14941 "parser_cocci_menhir.ml" +# 14942 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14954,7 +14955,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_mzl_eexpr__ = # 114 "standard.mly" ( [] ) -# 14958 "parser_cocci_menhir.ml" +# 14959 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -14984,7 +14985,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_mzl_eexpr__ = # 116 "standard.mly" ( x :: xs ) -# 14988 "parser_cocci_menhir.ml" +# 14989 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15001,7 +15002,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_mzl_fun_after_dots_or__ = # 114 "standard.mly" ( [] ) -# 15005 "parser_cocci_menhir.ml" +# 15006 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15031,7 +15032,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_mzl_fun_after_dots_or__ = # 116 "standard.mly" ( x :: xs ) -# 15035 "parser_cocci_menhir.ml" +# 15036 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15048,7 +15049,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_mzl_fun_start__ = # 114 "standard.mly" ( [] ) -# 15052 "parser_cocci_menhir.ml" +# 15053 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15078,7 +15079,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_mzl_fun_start__ = # 116 "standard.mly" ( x :: xs ) -# 15082 "parser_cocci_menhir.ml" +# 15083 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15095,7 +15096,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_mzl_rule_elem_statement__ = # 114 "standard.mly" ( [] ) -# 15099 "parser_cocci_menhir.ml" +# 15100 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15125,7 +15126,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_mzl_rule_elem_statement__ = # 116 "standard.mly" ( x :: xs ) -# 15129 "parser_cocci_menhir.ml" +# 15130 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15142,7 +15143,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_mzl_statement__ = # 114 "standard.mly" ( [] ) -# 15146 "parser_cocci_menhir.ml" +# 15147 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15172,7 +15173,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_mzl_statement__ = # 116 "standard.mly" ( x :: xs ) -# 15176 "parser_cocci_menhir.ml" +# 15177 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15189,7 +15190,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_pair_edots_when_TEllipsis_eexpr__dexpr__ = # 114 "standard.mly" ( [] ) -# 15193 "parser_cocci_menhir.ml" +# 15194 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15228,13 +15229,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 70 "standard.mly" ( (x, y) ) -# 15232 "parser_cocci_menhir.ml" +# 15233 "parser_cocci_menhir.ml" in # 116 "standard.mly" ( x :: xs ) -# 15238 "parser_cocci_menhir.ml" +# 15239 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15251,7 +15252,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_whenppdecs_ = # 114 "standard.mly" ( [] ) -# 15255 "parser_cocci_menhir.ml" +# 15256 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15281,7 +15282,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_list_whenppdecs_ = # 116 "standard.mly" ( x :: xs ) -# 15285 "parser_cocci_menhir.ml" +# 15286 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15298,7 +15299,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_choose_iso_ = # 57 "standard.mly" ( [] ) -# 15302 "parser_cocci_menhir.ml" +# 15303 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15322,7 +15323,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_choose_iso_ = # 59 "standard.mly" ( x ) -# 15326 "parser_cocci_menhir.ml" +# 15327 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15339,7 +15340,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_disable_ = # 57 "standard.mly" ( [] ) -# 15343 "parser_cocci_menhir.ml" +# 15344 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15363,7 +15364,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_disable_ = # 59 "standard.mly" ( x ) -# 15367 "parser_cocci_menhir.ml" +# 15368 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15380,7 +15381,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_error_words_ = # 57 "standard.mly" ( [] ) -# 15384 "parser_cocci_menhir.ml" +# 15385 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15404,7 +15405,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_error_words_ = # 59 "standard.mly" ( x ) -# 15408 "parser_cocci_menhir.ml" +# 15409 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15421,7 +15422,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_filespec_ = # 57 "standard.mly" ( [] ) -# 15425 "parser_cocci_menhir.ml" +# 15426 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15445,7 +15446,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_filespec_ = # 59 "standard.mly" ( x ) -# 15449 "parser_cocci_menhir.ml" +# 15450 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15462,7 +15463,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_minus_start_ = # 57 "standard.mly" ( [] ) -# 15466 "parser_cocci_menhir.ml" +# 15467 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15486,7 +15487,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_minus_start_ = # 59 "standard.mly" ( x ) -# 15490 "parser_cocci_menhir.ml" +# 15491 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15503,7 +15504,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_not_ceq_ = # 57 "standard.mly" ( [] ) -# 15507 "parser_cocci_menhir.ml" +# 15508 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15527,7 +15528,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_not_ceq_ = # 59 "standard.mly" ( x ) -# 15531 "parser_cocci_menhir.ml" +# 15532 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15544,7 +15545,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_not_eq_ = # 57 "standard.mly" ( [] ) -# 15548 "parser_cocci_menhir.ml" +# 15549 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15568,7 +15569,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_not_eq_ = # 59 "standard.mly" ( x ) -# 15572 "parser_cocci_menhir.ml" +# 15573 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15585,7 +15586,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_not_eqe_ = # 57 "standard.mly" ( [] ) -# 15589 "parser_cocci_menhir.ml" +# 15590 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15609,7 +15610,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_not_eqe_ = # 59 "standard.mly" ( x ) -# 15613 "parser_cocci_menhir.ml" +# 15614 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15626,7 +15627,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_not_pos_ = # 57 "standard.mly" ( [] ) -# 15630 "parser_cocci_menhir.ml" +# 15631 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15650,7 +15651,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_not_pos_ = # 59 "standard.mly" ( x ) -# 15654 "parser_cocci_menhir.ml" +# 15655 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15667,7 +15668,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_plus_start_ = # 57 "standard.mly" ( [] ) -# 15671 "parser_cocci_menhir.ml" +# 15672 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15691,7 +15692,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_loption_plus_start_ = # 59 "standard.mly" ( x ) -# 15695 "parser_cocci_menhir.ml" +# 15696 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15715,7 +15716,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_meta_exp_type = # 453 "parser_cocci_menhir.mly" ( [Ast0_cocci.ast0_type_to_type t] ) -# 15719 "parser_cocci_menhir.ml" +# 15720 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15755,7 +15756,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( List.map (function x -> P.ty_pointerify (Ast0_cocci.ast0_type_to_type x) m) t ) -# 15759 "parser_cocci_menhir.ml" +# 15760 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15786,14 +15787,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 47 "parser_cocci_menhir.mly" (string) -# 15790 "parser_cocci_menhir.ml" +# 15791 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_meta_ident = -# 1398 "parser_cocci_menhir.mly" +# 1399 "parser_cocci_menhir.mly" ( (Some _1,P.id2name _3) ) -# 15797 "parser_cocci_menhir.ml" +# 15798 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15817,11 +15818,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 157 "parser_cocci_menhir.mly" ((Ast_cocci.metavar,Ast_cocci.metavar) Common.either list) -# 15821 "parser_cocci_menhir.ml" +# 15822 "parser_cocci_menhir.ml" ) = # 181 "parser_cocci_menhir.mly" ( m (!Ast0.rule_name) ) -# 15825 "parser_cocci_menhir.ml" +# 15826 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15868,13 +15869,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta -> let tok = check_meta(Ast.MetaParamDecl(arity,name)) in !Data.add_param_meta name pure; tok) ) -# 15872 "parser_cocci_menhir.ml" +# 15873 "parser_cocci_menhir.ml" in # 263 "parser_cocci_menhir.mly" ( P.create_metadec ar ispure kindfn ids ) -# 15878 "parser_cocci_menhir.ml" +# 15879 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15925,13 +15926,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta -> let tok = check_meta(Ast.MetaParamListDecl(arity,name,None)) in !Data.add_paramlist_meta name None pure; tok) ) -# 15929 "parser_cocci_menhir.ml" +# 15930 "parser_cocci_menhir.ml" in # 263 "parser_cocci_menhir.mly" ( P.create_metadec ar ispure kindfn ids ) -# 15935 "parser_cocci_menhir.ml" +# 15936 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -15982,13 +15983,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta -> let tok = check_meta(Ast.MetaExpListDecl(arity,name,None)) in !Data.add_explist_meta name None pure; tok) ) -# 15986 "parser_cocci_menhir.ml" +# 15987 "parser_cocci_menhir.ml" in # 263 "parser_cocci_menhir.mly" ( P.create_metadec ar ispure kindfn ids ) -# 15992 "parser_cocci_menhir.ml" +# 15993 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16035,13 +16036,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta -> let tok = check_meta(Ast.MetaTypeDecl(arity,name)) in !Data.add_type_meta name pure; tok) ) -# 16039 "parser_cocci_menhir.ml" +# 16040 "parser_cocci_menhir.ml" in # 263 "parser_cocci_menhir.mly" ( P.create_metadec ar ispure kindfn ids ) -# 16045 "parser_cocci_menhir.ml" +# 16046 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16088,13 +16089,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta -> let tok = check_meta(Ast.MetaInitDecl(arity,name)) in !Data.add_init_meta name pure; tok) ) -# 16092 "parser_cocci_menhir.ml" +# 16093 "parser_cocci_menhir.ml" in # 263 "parser_cocci_menhir.mly" ( P.create_metadec ar ispure kindfn ids ) -# 16098 "parser_cocci_menhir.ml" +# 16099 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16141,13 +16142,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta -> let tok = check_meta(Ast.MetaStmDecl(arity,name)) in !Data.add_stm_meta name pure; tok) ) -# 16145 "parser_cocci_menhir.ml" +# 16146 "parser_cocci_menhir.ml" in # 263 "parser_cocci_menhir.mly" ( P.create_metadec ar ispure kindfn ids ) -# 16151 "parser_cocci_menhir.ml" +# 16152 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16198,13 +16199,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta -> let tok = check_meta(Ast.MetaStmListDecl(arity,name)) in !Data.add_stmlist_meta name pure; tok) ) -# 16202 "parser_cocci_menhir.ml" +# 16203 "parser_cocci_menhir.ml" in # 263 "parser_cocci_menhir.mly" ( P.create_metadec ar ispure kindfn ids ) -# 16208 "parser_cocci_menhir.ml" +# 16209 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16252,13 +16253,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct if arity = Ast.NONE && pure = Ast0.Impure then (!Data.add_type_name name; []) else raise (Semantic_cocci.Semantic "bad typedef")) ) -# 16256 "parser_cocci_menhir.ml" +# 16257 "parser_cocci_menhir.ml" in # 263 "parser_cocci_menhir.mly" ( P.create_metadec ar ispure kindfn ids ) -# 16262 "parser_cocci_menhir.ml" +# 16263 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16310,13 +16311,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct if arity = Ast.NONE && pure = Ast0.Impure then (!Data.add_declarer_name name; []) else raise (Semantic_cocci.Semantic "bad declarer")) ) -# 16314 "parser_cocci_menhir.ml" +# 16315 "parser_cocci_menhir.ml" in # 263 "parser_cocci_menhir.mly" ( P.create_metadec ar ispure kindfn ids ) -# 16320 "parser_cocci_menhir.ml" +# 16321 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16368,13 +16369,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct if arity = Ast.NONE && pure = Ast0.Impure then (!Data.add_iterator_name name; []) else raise (Semantic_cocci.Semantic "bad iterator")) ) -# 16372 "parser_cocci_menhir.ml" +# 16373 "parser_cocci_menhir.ml" in # 263 "parser_cocci_menhir.mly" ( P.create_metadec ar ispure kindfn ids ) -# 16378 "parser_cocci_menhir.ml" +# 16379 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16413,13 +16414,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun name check_meta seed -> let tok = check_meta(Ast.MetaFreshIdDecl(name,seed)) in !Data.add_fresh_id_meta name; tok) ) -# 16417 "parser_cocci_menhir.ml" +# 16418 "parser_cocci_menhir.ml" in # 266 "parser_cocci_menhir.mly" ( P.create_fresh_metadec kindfn ids ) -# 16423 "parser_cocci_menhir.ml" +# 16424 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16466,13 +16467,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta constraints -> let tok = check_meta(Ast.MetaIdDecl(arity,name)) in !Data.add_id_meta name constraints pure; tok) ) -# 16470 "parser_cocci_menhir.ml" +# 16471 "parser_cocci_menhir.ml" in # 270 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 16476 "parser_cocci_menhir.ml" +# 16477 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16519,13 +16520,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta constraints -> let tok = check_meta(Ast.MetaFuncDecl(arity,name)) in !Data.add_func_meta name constraints pure; tok) ) -# 16523 "parser_cocci_menhir.ml" +# 16524 "parser_cocci_menhir.ml" in # 270 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 16529 "parser_cocci_menhir.ml" +# 16530 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16577,13 +16578,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let tok = check_meta(Ast.MetaLocalFuncDecl(arity,name)) in !Data.add_local_func_meta name constraints pure; tok) ) -# 16581 "parser_cocci_menhir.ml" +# 16582 "parser_cocci_menhir.ml" in # 270 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 16587 "parser_cocci_menhir.ml" +# 16588 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16630,13 +16631,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta constraints -> let tok = check_meta(Ast.MetaDeclarerDecl(arity,name)) in !Data.add_declarer_meta name constraints pure; tok) ) -# 16634 "parser_cocci_menhir.ml" +# 16635 "parser_cocci_menhir.ml" in # 270 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 16640 "parser_cocci_menhir.ml" +# 16641 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16683,13 +16684,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta constraints -> let tok = check_meta(Ast.MetaIteratorDecl(arity,name)) in !Data.add_iterator_meta name constraints pure; tok) ) -# 16687 "parser_cocci_menhir.ml" +# 16688 "parser_cocci_menhir.ml" in # 270 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 16693 "parser_cocci_menhir.ml" +# 16694 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16736,13 +16737,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta constraints -> let tok = check_meta(Ast.MetaErrDecl(arity,name)) in !Data.add_err_meta name constraints pure; tok) ) -# 16740 "parser_cocci_menhir.ml" +# 16741 "parser_cocci_menhir.ml" in # 274 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 16746 "parser_cocci_menhir.ml" +# 16747 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16795,7 +16796,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 16799 "parser_cocci_menhir.ml" +# 16800 "parser_cocci_menhir.ml" in @@ -16808,13 +16809,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct | Some _ -> !Data.add_local_idexp_meta ty name constraints pure; check_meta(Ast.MetaLocalIdExpDecl(arity,name,ty))) ) -# 16812 "parser_cocci_menhir.ml" +# 16813 "parser_cocci_menhir.ml" in # 274 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 16818 "parser_cocci_menhir.ml" +# 16819 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16875,7 +16876,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 16879 "parser_cocci_menhir.ml" +# 16880 "parser_cocci_menhir.ml" in @@ -16888,13 +16889,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct | Some _ -> !Data.add_local_idexp_meta ty name constraints pure; check_meta(Ast.MetaLocalIdExpDecl(arity,name,ty))) ) -# 16892 "parser_cocci_menhir.ml" +# 16893 "parser_cocci_menhir.ml" in # 274 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 16898 "parser_cocci_menhir.ml" +# 16899 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -16961,13 +16962,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct | Some _ -> !Data.add_local_idexp_meta ty name constraints pure; check_meta(Ast.MetaLocalIdExpDecl(arity,name,ty))) ) -# 16965 "parser_cocci_menhir.ml" +# 16966 "parser_cocci_menhir.ml" in # 274 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 16971 "parser_cocci_menhir.ml" +# 16972 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17022,13 +17023,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty = Some [P.ty_pointerify Type_cocci.Unknown m] in let tok = check_meta(Ast.MetaExpDecl(arity,name,ty)) in !Data.add_exp_meta ty name constraints pure; tok) ) -# 17026 "parser_cocci_menhir.ml" +# 17027 "parser_cocci_menhir.ml" in # 274 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 17032 "parser_cocci_menhir.ml" +# 17033 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17087,13 +17088,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let ty = Some (List.map (function x -> Type_cocci.Array x) vl) in let tok = check_meta(Ast.MetaExpDecl(arity,name,ty)) in !Data.add_exp_meta ty name constraints pure; tok) ) -# 17091 "parser_cocci_menhir.ml" +# 17092 "parser_cocci_menhir.ml" in # 274 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 17097 "parser_cocci_menhir.ml" +# 17098 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17139,7 +17140,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 17143 "parser_cocci_menhir.ml" +# 17144 "parser_cocci_menhir.ml" in @@ -17147,13 +17148,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta constraints -> let tok = check_meta(Ast.MetaConstDecl(arity,name,ty)) in !Data.add_const_meta ty name constraints pure; tok) ) -# 17151 "parser_cocci_menhir.ml" +# 17152 "parser_cocci_menhir.ml" in # 274 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 17157 "parser_cocci_menhir.ml" +# 17158 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17207,7 +17208,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 17211 "parser_cocci_menhir.ml" +# 17212 "parser_cocci_menhir.ml" in @@ -17215,13 +17216,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta constraints -> let tok = check_meta(Ast.MetaConstDecl(arity,name,ty)) in !Data.add_const_meta ty name constraints pure; tok) ) -# 17219 "parser_cocci_menhir.ml" +# 17220 "parser_cocci_menhir.ml" in # 274 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 17225 "parser_cocci_menhir.ml" +# 17226 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17268,13 +17269,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( (fun arity name pure check_meta constraints -> let tok = check_meta(Ast.MetaExpDecl(arity,name,None)) in !Data.add_exp_meta None name constraints pure; tok) ) -# 17272 "parser_cocci_menhir.ml" +# 17273 "parser_cocci_menhir.ml" in # 278 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 17278 "parser_cocci_menhir.ml" +# 17279 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17340,13 +17341,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct constraints; let tok = check_meta(Ast.MetaExpDecl(arity,name,ty)) in !Data.add_exp_meta ty name constraints pure; tok) ) -# 17344 "parser_cocci_menhir.ml" +# 17345 "parser_cocci_menhir.ml" in # 278 "parser_cocci_menhir.mly" ( P.create_metadec_ne ar ispure kindfn ids ) -# 17350 "parser_cocci_menhir.ml" +# 17351 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17396,7 +17397,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let any = match a with None -> Ast.PER | Some _ -> Ast.ALL in !Data.add_pos_meta name constraints any; tok in P.create_metadec_ne ar false kindfn ids ) -# 17400 "parser_cocci_menhir.ml" +# 17401 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17463,7 +17464,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct check_meta(Ast.MetaParamListDecl(arity,name,Some lenname)) in !Data.add_paramlist_meta name (Some lenname) pure; tok) id ids ) -# 17467 "parser_cocci_menhir.ml" +# 17468 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17530,7 +17531,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct check_meta(Ast.MetaExpListDecl(arity,name,Some lenname)) in !Data.add_explist_meta name (Some lenname) pure; tok) id ids ) -# 17534 "parser_cocci_menhir.ml" +# 17535 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17558,9 +17559,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_midzero_list_ctype_ctype_ = -# 1802 "parser_cocci_menhir.mly" +# 1803 "parser_cocci_menhir.mly" ( let (mids,code) = List.split b in (mids,(a::code)) ) -# 17564 "parser_cocci_menhir.ml" +# 17565 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17588,9 +17589,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_midzero_list_eexpr_eexpr_ = -# 1802 "parser_cocci_menhir.mly" +# 1803 "parser_cocci_menhir.mly" ( let (mids,code) = List.split b in (mids,(a::code)) ) -# 17594 "parser_cocci_menhir.ml" +# 17595 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17618,9 +17619,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_midzero_list_expr_eexpr_ = -# 1802 "parser_cocci_menhir.mly" +# 1803 "parser_cocci_menhir.mly" ( let (mids,code) = List.split b in (mids,(a::code)) ) -# 17624 "parser_cocci_menhir.ml" +# 17625 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17648,9 +17649,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_midzero_list_fun_after_stm_fun_after_dots_or_ = -# 1802 "parser_cocci_menhir.mly" +# 1803 "parser_cocci_menhir.mly" ( let (mids,code) = List.split b in (mids,(a::code)) ) -# 17654 "parser_cocci_menhir.ml" +# 17655 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17678,9 +17679,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_midzero_list_fun_start_fun_start_ = -# 1802 "parser_cocci_menhir.mly" +# 1803 "parser_cocci_menhir.mly" ( let (mids,code) = List.split b in (mids,(a::code)) ) -# 17684 "parser_cocci_menhir.ml" +# 17685 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17708,9 +17709,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_midzero_list_rule_elem_statement_rule_elem_statement_ = -# 1802 "parser_cocci_menhir.mly" +# 1803 "parser_cocci_menhir.mly" ( let (mids,code) = List.split b in (mids,(a::code)) ) -# 17714 "parser_cocci_menhir.ml" +# 17715 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17738,9 +17739,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_midzero_list_statement_statement_ = -# 1802 "parser_cocci_menhir.mly" +# 1803 "parser_cocci_menhir.mly" ( let (mids,code) = List.split b in (mids,(a::code)) ) -# 17744 "parser_cocci_menhir.ml" +# 17745 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17778,7 +17779,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( match f@b@ew with [] -> raise (Semantic_cocci.Semantic "minus slice can't be empty") | code -> Top_level.top_level code ) -# 17782 "parser_cocci_menhir.ml" +# 17783 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17816,7 +17817,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( match f@[b]@ew with [] -> raise (Semantic_cocci.Semantic "minus slice can't be empty") | code -> Top_level.top_level code ) -# 17820 "parser_cocci_menhir.ml" +# 17821 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17844,11 +17845,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 137 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 17848 "parser_cocci_menhir.ml" +# 17849 "parser_cocci_menhir.ml" ) = # 177 "parser_cocci_menhir.mly" ( _1 ) -# 17852 "parser_cocci_menhir.ml" +# 17853 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17876,11 +17877,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 137 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 17880 "parser_cocci_menhir.ml" +# 17881 "parser_cocci_menhir.ml" ) = # 177 "parser_cocci_menhir.mly" ( m ) -# 17884 "parser_cocci_menhir.ml" +# 17885 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17908,11 +17909,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 137 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 17912 "parser_cocci_menhir.ml" +# 17913 "parser_cocci_menhir.ml" ) = # 178 "parser_cocci_menhir.mly" ( m ) -# 17916 "parser_cocci_menhir.ml" +# 17917 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17940,11 +17941,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 134 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 17944 "parser_cocci_menhir.ml" +# 17945 "parser_cocci_menhir.ml" ) = # 173 "parser_cocci_menhir.mly" ( _1 ) -# 17948 "parser_cocci_menhir.ml" +# 17949 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -17972,11 +17973,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 134 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 17976 "parser_cocci_menhir.ml" +# 17977 "parser_cocci_menhir.ml" ) = # 173 "parser_cocci_menhir.mly" ( m ) -# 17980 "parser_cocci_menhir.ml" +# 17981 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18004,11 +18005,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 134 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 18008 "parser_cocci_menhir.ml" +# 18009 "parser_cocci_menhir.ml" ) = # 174 "parser_cocci_menhir.mly" ( m ) -# 18012 "parser_cocci_menhir.ml" +# 18013 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18030,9 +18031,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_minus_start = -# 1611 "parser_cocci_menhir.mly" +# 1612 "parser_cocci_menhir.mly" ( [Ast0.wrap(Ast0.DECL(_1))] ) -# 18036 "parser_cocci_menhir.ml" +# 18037 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18054,9 +18055,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_minus_start = -# 1612 "parser_cocci_menhir.mly" +# 1613 "parser_cocci_menhir.mly" ( [Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Ty(_1))))] ) -# 18060 "parser_cocci_menhir.ml" +# 18061 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18078,9 +18079,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_minus_start = -# 1613 "parser_cocci_menhir.mly" +# 1614 "parser_cocci_menhir.mly" ( [Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.TopInit(_1))))] ) -# 18084 "parser_cocci_menhir.ml" +# 18085 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18102,9 +18103,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_minus_start = -# 1615 "parser_cocci_menhir.mly" +# 1616 "parser_cocci_menhir.mly" ( List.map (function x -> Ast0.wrap(Ast0.OTHER(x))) _1 ) -# 18108 "parser_cocci_menhir.ml" +# 18109 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18131,14 +18132,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let a : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 18135 "parser_cocci_menhir.ml" +# 18136 "parser_cocci_menhir.ml" ) = Obj.magic a in let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_mzl_ctype_ = -# 1805 "parser_cocci_menhir.mly" +# 1806 "parser_cocci_menhir.mly" ( (P.clt2mcode "|" a, b) ) -# 18142 "parser_cocci_menhir.ml" +# 18143 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18165,14 +18166,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let a : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 18169 "parser_cocci_menhir.ml" +# 18170 "parser_cocci_menhir.ml" ) = Obj.magic a in let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_mzl_eexpr_ = -# 1805 "parser_cocci_menhir.mly" +# 1806 "parser_cocci_menhir.mly" ( (P.clt2mcode "|" a, b) ) -# 18176 "parser_cocci_menhir.ml" +# 18177 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18199,14 +18200,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let a : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 18203 "parser_cocci_menhir.ml" +# 18204 "parser_cocci_menhir.ml" ) = Obj.magic a in let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_mzl_fun_after_dots_or_ = -# 1805 "parser_cocci_menhir.mly" +# 1806 "parser_cocci_menhir.mly" ( (P.clt2mcode "|" a, b) ) -# 18210 "parser_cocci_menhir.ml" +# 18211 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18233,14 +18234,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let a : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 18237 "parser_cocci_menhir.ml" +# 18238 "parser_cocci_menhir.ml" ) = Obj.magic a in let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_mzl_fun_start_ = -# 1805 "parser_cocci_menhir.mly" +# 1806 "parser_cocci_menhir.mly" ( (P.clt2mcode "|" a, b) ) -# 18244 "parser_cocci_menhir.ml" +# 18245 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18267,14 +18268,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let a : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 18271 "parser_cocci_menhir.ml" +# 18272 "parser_cocci_menhir.ml" ) = Obj.magic a in let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_mzl_rule_elem_statement_ = -# 1805 "parser_cocci_menhir.mly" +# 1806 "parser_cocci_menhir.mly" ( (P.clt2mcode "|" a, b) ) -# 18278 "parser_cocci_menhir.ml" +# 18279 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18301,14 +18302,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let a : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 18305 "parser_cocci_menhir.ml" +# 18306 "parser_cocci_menhir.ml" ) = Obj.magic a in let _startpos = _startpos_a_ in let _endpos = _endpos_b_ in let _v : 'tv_mzl_statement_ = -# 1805 "parser_cocci_menhir.mly" +# 1806 "parser_cocci_menhir.mly" ( (P.clt2mcode "|" a, b) ) -# 18312 "parser_cocci_menhir.ml" +# 18313 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18330,9 +18331,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_name_opt_decl = -# 839 "parser_cocci_menhir.mly" +# 840 "parser_cocci_menhir.mly" ( _1 ) -# 18336 "parser_cocci_menhir.ml" +# 18337 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18354,9 +18355,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_t_ in let _endpos = _endpos_t_ in let _v : 'tv_name_opt_decl = -# 840 "parser_cocci_menhir.mly" +# 841 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Param(t, None)) ) -# 18360 "parser_cocci_menhir.ml" +# 18361 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18407,41 +18408,41 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let rp1 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 18411 "parser_cocci_menhir.ml" +# 18412 "parser_cocci_menhir.ml" ) = Obj.magic rp1 in let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in let lp1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 18417 "parser_cocci_menhir.ml" +# 18418 "parser_cocci_menhir.ml" ) = Obj.magic lp1 in let rp : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 18422 "parser_cocci_menhir.ml" +# 18423 "parser_cocci_menhir.ml" ) = Obj.magic rp in let s : ( # 99 "parser_cocci_menhir.mly" (Data.clt) -# 18427 "parser_cocci_menhir.ml" +# 18428 "parser_cocci_menhir.ml" ) = Obj.magic s in let lp : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 18432 "parser_cocci_menhir.ml" +# 18433 "parser_cocci_menhir.ml" ) = Obj.magic lp in let t : 'tv_fn_ctype = Obj.magic t in let _startpos = _startpos_t_ in let _endpos = _endpos_rp1_ in let _v : 'tv_name_opt_decl = -# 843 "parser_cocci_menhir.mly" +# 844 "parser_cocci_menhir.mly" ( let fnptr = Ast0.wrap (Ast0.FunctionPointer (t,P.clt2mcode "(" lp,P.clt2mcode "*" s,P.clt2mcode ")" rp, P.clt2mcode "(" lp1,d,P.clt2mcode ")" rp1)) in Ast0.wrap(Ast0.Param(fnptr, None)) ) -# 18445 "parser_cocci_menhir.ml" +# 18446 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18469,9 +18470,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_nest_after_dots = -# 1726 "parser_cocci_menhir.mly" +# 1727 "parser_cocci_menhir.mly" (_1@_2) -# 18475 "parser_cocci_menhir.ml" +# 18476 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18497,9 +18498,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_nest_after_dots = -# 1727 "parser_cocci_menhir.mly" +# 1728 "parser_cocci_menhir.mly" (_2) -# 18503 "parser_cocci_menhir.ml" +# 18504 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18527,9 +18528,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_nest_after_dots = -# 1728 "parser_cocci_menhir.mly" +# 1729 "parser_cocci_menhir.mly" ((Ast0.wrap(Ast0.Exp(_1)))::_2) -# 18533 "parser_cocci_menhir.ml" +# 18534 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18544,9 +18545,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_nest_after_exp = -# 1736 "parser_cocci_menhir.mly" +# 1737 "parser_cocci_menhir.mly" ([]) -# 18550 "parser_cocci_menhir.ml" +# 18551 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18574,9 +18575,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_nest_after_exp = -# 1737 "parser_cocci_menhir.mly" +# 1738 "parser_cocci_menhir.mly" (_1::_2) -# 18580 "parser_cocci_menhir.ml" +# 18581 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18591,9 +18592,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_nest_after_stm = -# 1731 "parser_cocci_menhir.mly" +# 1732 "parser_cocci_menhir.mly" ([]) -# 18597 "parser_cocci_menhir.ml" +# 18598 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18621,9 +18622,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_nest_after_stm = -# 1732 "parser_cocci_menhir.mly" +# 1733 "parser_cocci_menhir.mly" (_1::_2) -# 18627 "parser_cocci_menhir.ml" +# 18628 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18651,9 +18652,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_nest_after_stm = -# 1733 "parser_cocci_menhir.mly" +# 1734 "parser_cocci_menhir.mly" (_1@_2) -# 18657 "parser_cocci_menhir.ml" +# 18658 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18684,22 +18685,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let c : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 18688 "parser_cocci_menhir.ml" +# 18689 "parser_cocci_menhir.ml" ) = Obj.magic c in let e : 'tv_expr_dots_TEllipsis_ = Obj.magic e in let _1 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 18694 "parser_cocci_menhir.ml" +# 18695 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos_c_ in let _v : 'tv_nest_expressions = -# 1221 "parser_cocci_menhir.mly" +# 1222 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.NestExpr(P.clt2mcode "<..." _1, Ast0.wrap(Ast0.DOTS(e (P.mkedots "..."))), P.clt2mcode "...>" c, None, false)) ) -# 18703 "parser_cocci_menhir.ml" +# 18704 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18730,22 +18731,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let c : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 18734 "parser_cocci_menhir.ml" +# 18735 "parser_cocci_menhir.ml" ) = Obj.magic c in let e : 'tv_expr_dots_TEllipsis_ = Obj.magic e in let _1 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 18740 "parser_cocci_menhir.ml" +# 18741 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos_c_ in let _v : 'tv_nest_expressions = -# 1225 "parser_cocci_menhir.mly" +# 1226 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.NestExpr(P.clt2mcode "<+..." _1, Ast0.wrap(Ast0.DOTS(e (P.mkedots "..."))), P.clt2mcode "...+>" c, None, true)) ) -# 18749 "parser_cocci_menhir.ml" +# 18750 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18767,9 +18768,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_nest_start = -# 1723 "parser_cocci_menhir.mly" +# 1724 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DOTS(_1)) ) -# 18773 "parser_cocci_menhir.ml" +# 18774 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18791,11 +18792,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 168 "parser_cocci_menhir.mly" (unit) -# 18795 "parser_cocci_menhir.ml" +# 18796 "parser_cocci_menhir.ml" ) = -# 1868 "parser_cocci_menhir.mly" +# 1874 "parser_cocci_menhir.mly" ( () ) -# 18799 "parser_cocci_menhir.ml" +# 18800 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18821,11 +18822,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 168 "parser_cocci_menhir.mly" (unit) -# 18825 "parser_cocci_menhir.ml" +# 18826 "parser_cocci_menhir.ml" ) = -# 1869 "parser_cocci_menhir.mly" +# 1875 "parser_cocci_menhir.mly" ( () ) -# 18829 "parser_cocci_menhir.ml" +# 18830 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18847,11 +18848,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 168 "parser_cocci_menhir.mly" (unit) -# 18851 "parser_cocci_menhir.ml" +# 18852 "parser_cocci_menhir.ml" ) = -# 1870 "parser_cocci_menhir.mly" +# 1876 "parser_cocci_menhir.mly" ( () ) -# 18855 "parser_cocci_menhir.ml" +# 18856 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18879,10 +18880,10 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_g_ in let _endpos = _endpos_dg_ in let _v : 'tv_no_dot_start_end_dexpr_edots_when_TEllipsis_eexpr__ = -# 1389 "parser_cocci_menhir.mly" +# 1390 "parser_cocci_menhir.mly" ( function dot_builder -> g :: (List.concat(List.map (function (d,g) -> [dot_builder d;g]) dg)) ) -# 18886 "parser_cocci_menhir.ml" +# 18887 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18903,14 +18904,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let x : ( # 99 "parser_cocci_menhir.mly" (Data.clt) -# 18907 "parser_cocci_menhir.ml" +# 18908 "parser_cocci_menhir.ml" ) = Obj.magic x in let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : 'tv_nonempty_list_TMul_ = # 124 "standard.mly" ( [ x ] ) -# 18914 "parser_cocci_menhir.ml" +# 18915 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18937,14 +18938,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let x : ( # 99 "parser_cocci_menhir.mly" (Data.clt) -# 18941 "parser_cocci_menhir.ml" +# 18942 "parser_cocci_menhir.ml" ) = Obj.magic x in let _startpos = _startpos_x_ in let _endpos = _endpos_xs_ in let _v : 'tv_nonempty_list_TMul_ = # 126 "standard.mly" ( x :: xs ) -# 18948 "parser_cocci_menhir.ml" +# 18949 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -18970,13 +18971,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_i_ in let _v : 'tv_not_ceq = -# 1450 "parser_cocci_menhir.mly" +# 1451 "parser_cocci_menhir.mly" ( (if !Data.in_iso then failwith "constraints not allowed in iso file"); (if !Data.in_generating then failwith "constraints not allowed in a generated rule file"); [i] ) -# 18980 "parser_cocci_menhir.ml" +# 18981 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19010,13 +19011,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_not_ceq = -# 1456 "parser_cocci_menhir.mly" +# 1457 "parser_cocci_menhir.mly" ( (if !Data.in_iso then failwith "constraints not allowed in iso file"); (if !Data.in_generating then failwith "constraints not allowed in a generated rule file"); l ) -# 19020 "parser_cocci_menhir.ml" +# 19021 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19042,7 +19043,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_i_ in let _v : 'tv_not_eq = -# 1417 "parser_cocci_menhir.mly" +# 1418 "parser_cocci_menhir.mly" ( (if !Data.in_iso then failwith "constraints not allowed in iso file"); (if !Data.in_generating @@ -19050,7 +19051,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct them in the pattern *) then failwith "constraints not allowed in a generated rule file"); [Ast0.wrap(Ast0.Id(P.id2mcode i))] ) -# 19054 "parser_cocci_menhir.ml" +# 19055 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19084,13 +19085,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_not_eq = -# 1425 "parser_cocci_menhir.mly" +# 1426 "parser_cocci_menhir.mly" ( (if !Data.in_iso then failwith "constraints not allowed in iso file"); (if !Data.in_generating then failwith "constraints not allowed in a generated rule file"); List.map (function i -> Ast0.wrap(Ast0.Id(P.id2mcode i))) l ) -# 19094 "parser_cocci_menhir.ml" +# 19095 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19116,13 +19117,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_i_ in let _v : 'tv_not_eqe = -# 1433 "parser_cocci_menhir.mly" +# 1434 "parser_cocci_menhir.mly" ( (if !Data.in_iso then failwith "constraints not allowed in iso file"); (if !Data.in_generating then failwith "constraints not allowed in a generated rule file"); [Ast0.wrap(Ast0.Ident(Ast0.wrap(Ast0.Id(P.id2mcode i))))] ) -# 19126 "parser_cocci_menhir.ml" +# 19127 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19156,7 +19157,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_not_eqe = -# 1439 "parser_cocci_menhir.mly" +# 1440 "parser_cocci_menhir.mly" ( (if !Data.in_iso then failwith "constraints not allowed in iso file"); (if !Data.in_generating @@ -19165,7 +19166,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (function i -> Ast0.wrap(Ast0.Ident(Ast0.wrap(Ast0.Id(P.id2mcode i))))) l ) -# 19169 "parser_cocci_menhir.ml" +# 19170 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19191,7 +19192,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos_i_ in let _v : 'tv_not_pos = -# 1470 "parser_cocci_menhir.mly" +# 1471 "parser_cocci_menhir.mly" ( (if !Data.in_iso then failwith "constraints not allowed in iso file"); (if !Data.in_generating @@ -19202,7 +19203,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let i = (rule,name) in P.check_meta(Ast.MetaPosDecl(Ast.NONE,i)); [i] ) -# 19206 "parser_cocci_menhir.ml" +# 19207 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19236,7 +19237,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_not_pos = -# 1481 "parser_cocci_menhir.mly" +# 1482 "parser_cocci_menhir.mly" ( (if !Data.in_iso then failwith "constraints not allowed in iso file"); (if !Data.in_generating @@ -19250,7 +19251,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct P.check_meta(Ast.MetaPosDecl(Ast.NONE,i)); i) l ) -# 19254 "parser_cocci_menhir.ml" +# 19255 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19272,9 +19273,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_one_dec_decl_ = -# 1555 "parser_cocci_menhir.mly" +# 1556 "parser_cocci_menhir.mly" ( _1 ) -# 19278 "parser_cocci_menhir.ml" +# 19279 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19295,12 +19296,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 66 "parser_cocci_menhir.mly" (Parse_aux.list_info) -# 19299 "parser_cocci_menhir.ml" +# 19300 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_one_dec_decl_ = -# 1557 "parser_cocci_menhir.mly" +# 1558 "parser_cocci_menhir.mly" ( let (nm,lenname,pure,clt) = _1 in let nm = P.clt2mcode nm clt in let lenname = @@ -19308,7 +19309,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct Some nm -> Some(P.clt2mcode nm clt) | None -> None in Ast0.wrap(Ast0.MetaParamList(nm,lenname,pure)) ) -# 19312 "parser_cocci_menhir.ml" +# 19313 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19330,9 +19331,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_one_dec_name_opt_decl_ = -# 1555 "parser_cocci_menhir.mly" +# 1556 "parser_cocci_menhir.mly" ( _1 ) -# 19336 "parser_cocci_menhir.ml" +# 19337 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19353,12 +19354,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 66 "parser_cocci_menhir.mly" (Parse_aux.list_info) -# 19357 "parser_cocci_menhir.ml" +# 19358 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_one_dec_name_opt_decl_ = -# 1557 "parser_cocci_menhir.mly" +# 1558 "parser_cocci_menhir.mly" ( let (nm,lenname,pure,clt) = _1 in let nm = P.clt2mcode nm clt in let lenname = @@ -19366,7 +19367,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct Some nm -> Some(P.clt2mcode nm clt) | None -> None in Ast0.wrap(Ast0.MetaParamList(nm,lenname,pure)) ) -# 19370 "parser_cocci_menhir.ml" +# 19371 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19392,15 +19393,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19396 "parser_cocci_menhir.ml" +# 19397 "parser_cocci_menhir.ml" ) = Obj.magic pv in let t : 'tv_ctype = Obj.magic t in let _startpos = _startpos_t_ in let _endpos = _endpos_pv_ in let _v : 'tv_one_decl_var = -# 1010 "parser_cocci_menhir.mly" +# 1011 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.TyDecl(t,P.clt2mcode ";" pv)) ) -# 19404 "parser_cocci_menhir.ml" +# 19405 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19431,7 +19432,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19435 "parser_cocci_menhir.ml" +# 19436 "parser_cocci_menhir.ml" ) = Obj.magic pv in let d : 'tv_d_ident = Obj.magic d in let t : 'tv_ctype = Obj.magic t in @@ -19441,14 +19442,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 19445 "parser_cocci_menhir.ml" +# 19446 "parser_cocci_menhir.ml" in -# 1012 "parser_cocci_menhir.mly" +# 1013 "parser_cocci_menhir.mly" ( let (id,fn) = d in Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)) ) -# 19452 "parser_cocci_menhir.ml" +# 19453 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19484,7 +19485,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19488 "parser_cocci_menhir.ml" +# 19489 "parser_cocci_menhir.ml" ) = Obj.magic pv in let d : 'tv_d_ident = Obj.magic d in let t : 'tv_ctype = Obj.magic t in @@ -19496,14 +19497,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 19500 "parser_cocci_menhir.ml" +# 19501 "parser_cocci_menhir.ml" in -# 1012 "parser_cocci_menhir.mly" +# 1013 "parser_cocci_menhir.mly" ( let (id,fn) = d in Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)) ) -# 19507 "parser_cocci_menhir.ml" +# 19508 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19525,9 +19526,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_f_ in let _endpos = _endpos_f_ in let _v : 'tv_one_decl_var = -# 1014 "parser_cocci_menhir.mly" +# 1015 "parser_cocci_menhir.mly" ( f ) -# 19531 "parser_cocci_menhir.ml" +# 19532 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19568,13 +19569,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19572 "parser_cocci_menhir.ml" +# 19573 "parser_cocci_menhir.ml" ) = Obj.magic pv in let e : 'tv_initialize = Obj.magic e in let q : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19578 "parser_cocci_menhir.ml" +# 19579 "parser_cocci_menhir.ml" ) = Obj.magic q in let d : 'tv_d_ident = Obj.magic d in let t : 'tv_ctype = Obj.magic t in @@ -19584,14 +19585,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 19588 "parser_cocci_menhir.ml" +# 19589 "parser_cocci_menhir.ml" in -# 1016 "parser_cocci_menhir.mly" +# 1017 "parser_cocci_menhir.mly" ( let (id,fn) = d in Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv)) ) -# 19595 "parser_cocci_menhir.ml" +# 19596 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19637,13 +19638,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19641 "parser_cocci_menhir.ml" +# 19642 "parser_cocci_menhir.ml" ) = Obj.magic pv in let e : 'tv_initialize = Obj.magic e in let q : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19647 "parser_cocci_menhir.ml" +# 19648 "parser_cocci_menhir.ml" ) = Obj.magic q in let d : 'tv_d_ident = Obj.magic d in let t : 'tv_ctype = Obj.magic t in @@ -19655,14 +19656,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 19659 "parser_cocci_menhir.ml" +# 19660 "parser_cocci_menhir.ml" in -# 1016 "parser_cocci_menhir.mly" +# 1017 "parser_cocci_menhir.mly" ( let (id,fn) = d in Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv)) ) -# 19666 "parser_cocci_menhir.ml" +# 19667 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19693,7 +19694,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19697 "parser_cocci_menhir.ml" +# 19698 "parser_cocci_menhir.ml" ) = Obj.magic pv in let d : 'tv_d_ident = Obj.magic d in let i : 'tv_pure_ident = Obj.magic i in @@ -19703,22 +19704,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 19707 "parser_cocci_menhir.ml" +# 19708 "parser_cocci_menhir.ml" in let s = # 39 "standard.mly" ( None ) -# 19714 "parser_cocci_menhir.ml" +# 19715 "parser_cocci_menhir.ml" in -# 1021 "parser_cocci_menhir.mly" +# 1022 "parser_cocci_menhir.mly" ( let (id,fn) = d in let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)) ) -# 19722 "parser_cocci_menhir.ml" +# 19723 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19754,7 +19755,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19758 "parser_cocci_menhir.ml" +# 19759 "parser_cocci_menhir.ml" ) = Obj.magic pv in let d : 'tv_d_ident = Obj.magic d in let i : 'tv_pure_ident = Obj.magic i in @@ -19766,22 +19767,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 19770 "parser_cocci_menhir.ml" +# 19771 "parser_cocci_menhir.ml" in let s = # 39 "standard.mly" ( None ) -# 19777 "parser_cocci_menhir.ml" +# 19778 "parser_cocci_menhir.ml" in -# 1021 "parser_cocci_menhir.mly" +# 1022 "parser_cocci_menhir.mly" ( let (id,fn) = d in let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)) ) -# 19785 "parser_cocci_menhir.ml" +# 19786 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19817,7 +19818,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19821 "parser_cocci_menhir.ml" +# 19822 "parser_cocci_menhir.ml" ) = Obj.magic pv in let d : 'tv_d_ident = Obj.magic d in let i : 'tv_pure_ident = Obj.magic i in @@ -19828,7 +19829,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 19832 "parser_cocci_menhir.ml" +# 19833 "parser_cocci_menhir.ml" in let s = @@ -19836,15 +19837,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 19840 "parser_cocci_menhir.ml" +# 19841 "parser_cocci_menhir.ml" in -# 1021 "parser_cocci_menhir.mly" +# 1022 "parser_cocci_menhir.mly" ( let (id,fn) = d in let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)) ) -# 19848 "parser_cocci_menhir.ml" +# 19849 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19885,7 +19886,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19889 "parser_cocci_menhir.ml" +# 19890 "parser_cocci_menhir.ml" ) = Obj.magic pv in let d : 'tv_d_ident = Obj.magic d in let i : 'tv_pure_ident = Obj.magic i in @@ -19898,7 +19899,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 19902 "parser_cocci_menhir.ml" +# 19903 "parser_cocci_menhir.ml" in let s = @@ -19906,15 +19907,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 19910 "parser_cocci_menhir.ml" +# 19911 "parser_cocci_menhir.ml" in -# 1021 "parser_cocci_menhir.mly" +# 1022 "parser_cocci_menhir.mly" ( let (id,fn) = d in let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)) ) -# 19918 "parser_cocci_menhir.ml" +# 19919 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -19955,13 +19956,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19959 "parser_cocci_menhir.ml" +# 19960 "parser_cocci_menhir.ml" ) = Obj.magic pv in let e : 'tv_initialize = Obj.magic e in let q : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 19965 "parser_cocci_menhir.ml" +# 19966 "parser_cocci_menhir.ml" ) = Obj.magic q in let d : 'tv_d_ident = Obj.magic d in let i : 'tv_pure_ident = Obj.magic i in @@ -19971,24 +19972,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 19975 "parser_cocci_menhir.ml" +# 19976 "parser_cocci_menhir.ml" in let s = # 39 "standard.mly" ( None ) -# 19982 "parser_cocci_menhir.ml" +# 19983 "parser_cocci_menhir.ml" in -# 1026 "parser_cocci_menhir.mly" +# 1027 "parser_cocci_menhir.mly" ( let (id,fn) = d in !Data.add_type_name (P.id2name i); let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e, P.clt2mcode ";" pv)) ) -# 19992 "parser_cocci_menhir.ml" +# 19993 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20034,13 +20035,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20038 "parser_cocci_menhir.ml" +# 20039 "parser_cocci_menhir.ml" ) = Obj.magic pv in let e : 'tv_initialize = Obj.magic e in let q : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20044 "parser_cocci_menhir.ml" +# 20045 "parser_cocci_menhir.ml" ) = Obj.magic q in let d : 'tv_d_ident = Obj.magic d in let i : 'tv_pure_ident = Obj.magic i in @@ -20052,24 +20053,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 20056 "parser_cocci_menhir.ml" +# 20057 "parser_cocci_menhir.ml" in let s = # 39 "standard.mly" ( None ) -# 20063 "parser_cocci_menhir.ml" +# 20064 "parser_cocci_menhir.ml" in -# 1026 "parser_cocci_menhir.mly" +# 1027 "parser_cocci_menhir.mly" ( let (id,fn) = d in !Data.add_type_name (P.id2name i); let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e, P.clt2mcode ";" pv)) ) -# 20073 "parser_cocci_menhir.ml" +# 20074 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20115,13 +20116,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20119 "parser_cocci_menhir.ml" +# 20120 "parser_cocci_menhir.ml" ) = Obj.magic pv in let e : 'tv_initialize = Obj.magic e in let q : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20125 "parser_cocci_menhir.ml" +# 20126 "parser_cocci_menhir.ml" ) = Obj.magic q in let d : 'tv_d_ident = Obj.magic d in let i : 'tv_pure_ident = Obj.magic i in @@ -20132,7 +20133,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 20136 "parser_cocci_menhir.ml" +# 20137 "parser_cocci_menhir.ml" in let s = @@ -20140,17 +20141,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 20144 "parser_cocci_menhir.ml" +# 20145 "parser_cocci_menhir.ml" in -# 1026 "parser_cocci_menhir.mly" +# 1027 "parser_cocci_menhir.mly" ( let (id,fn) = d in !Data.add_type_name (P.id2name i); let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e, P.clt2mcode ";" pv)) ) -# 20154 "parser_cocci_menhir.ml" +# 20155 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20201,13 +20202,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20205 "parser_cocci_menhir.ml" +# 20206 "parser_cocci_menhir.ml" ) = Obj.magic pv in let e : 'tv_initialize = Obj.magic e in let q : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20211 "parser_cocci_menhir.ml" +# 20212 "parser_cocci_menhir.ml" ) = Obj.magic q in let d : 'tv_d_ident = Obj.magic d in let i : 'tv_pure_ident = Obj.magic i in @@ -20220,7 +20221,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 20224 "parser_cocci_menhir.ml" +# 20225 "parser_cocci_menhir.ml" in let s = @@ -20228,17 +20229,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 20232 "parser_cocci_menhir.ml" +# 20233 "parser_cocci_menhir.ml" in -# 1026 "parser_cocci_menhir.mly" +# 1027 "parser_cocci_menhir.mly" ( let (id,fn) = d in !Data.add_type_name (P.id2name i); let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e, P.clt2mcode ";" pv)) ) -# 20242 "parser_cocci_menhir.ml" +# 20243 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20299,34 +20300,34 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20303 "parser_cocci_menhir.ml" +# 20304 "parser_cocci_menhir.ml" ) = Obj.magic pv in let rp2 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 20308 "parser_cocci_menhir.ml" +# 20309 "parser_cocci_menhir.ml" ) = Obj.magic rp2 in let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in let lp2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 20314 "parser_cocci_menhir.ml" +# 20315 "parser_cocci_menhir.ml" ) = Obj.magic lp2 in let rp1 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 20319 "parser_cocci_menhir.ml" +# 20320 "parser_cocci_menhir.ml" ) = Obj.magic rp1 in let d : 'tv_d_ident = Obj.magic d in let st : ( # 99 "parser_cocci_menhir.mly" (Data.clt) -# 20325 "parser_cocci_menhir.ml" +# 20326 "parser_cocci_menhir.ml" ) = Obj.magic st in let lp1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 20330 "parser_cocci_menhir.ml" +# 20331 "parser_cocci_menhir.ml" ) = Obj.magic lp1 in let t : 'tv_fn_ctype = Obj.magic t in let _startpos = _startpos_t_ in @@ -20335,11 +20336,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 20339 "parser_cocci_menhir.ml" +# 20340 "parser_cocci_menhir.ml" in -# 1036 "parser_cocci_menhir.mly" +# 1037 "parser_cocci_menhir.mly" ( let (id,fn) = d in let t = Ast0.wrap @@ -20347,7 +20348,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1, P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)) ) -# 20351 "parser_cocci_menhir.ml" +# 20352 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20413,34 +20414,34 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20417 "parser_cocci_menhir.ml" +# 20418 "parser_cocci_menhir.ml" ) = Obj.magic pv in let rp2 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 20422 "parser_cocci_menhir.ml" +# 20423 "parser_cocci_menhir.ml" ) = Obj.magic rp2 in let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in let lp2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 20428 "parser_cocci_menhir.ml" +# 20429 "parser_cocci_menhir.ml" ) = Obj.magic lp2 in let rp1 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 20433 "parser_cocci_menhir.ml" +# 20434 "parser_cocci_menhir.ml" ) = Obj.magic rp1 in let d : 'tv_d_ident = Obj.magic d in let st : ( # 99 "parser_cocci_menhir.mly" (Data.clt) -# 20439 "parser_cocci_menhir.ml" +# 20440 "parser_cocci_menhir.ml" ) = Obj.magic st in let lp1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 20444 "parser_cocci_menhir.ml" +# 20445 "parser_cocci_menhir.ml" ) = Obj.magic lp1 in let t : 'tv_fn_ctype = Obj.magic t in let x0 : 'tv_storage = Obj.magic x0 in @@ -20451,11 +20452,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 20455 "parser_cocci_menhir.ml" +# 20456 "parser_cocci_menhir.ml" in -# 1036 "parser_cocci_menhir.mly" +# 1037 "parser_cocci_menhir.mly" ( let (id,fn) = d in let t = Ast0.wrap @@ -20463,7 +20464,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1, P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)) ) -# 20467 "parser_cocci_menhir.ml" +# 20468 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20504,27 +20505,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _5 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20508 "parser_cocci_menhir.ml" +# 20509 "parser_cocci_menhir.ml" ) = Obj.magic _5 in let _4 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 20513 "parser_cocci_menhir.ml" +# 20514 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr_list_option = Obj.magic _3 in let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 20519 "parser_cocci_menhir.ml" +# 20520 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_decl_ident = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : 'tv_one_decl_var = -# 1044 "parser_cocci_menhir.mly" +# 1045 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.MacroDecl(_1,P.clt2mcode "(" _2,_3, P.clt2mcode ")" _4,P.clt2mcode ";" _5)) ) -# 20528 "parser_cocci_menhir.ml" +# 20529 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20595,40 +20596,40 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20599 "parser_cocci_menhir.ml" +# 20600 "parser_cocci_menhir.ml" ) = Obj.magic pv in let e : 'tv_initialize = Obj.magic e in let q : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20605 "parser_cocci_menhir.ml" +# 20606 "parser_cocci_menhir.ml" ) = Obj.magic q in let rp2 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 20610 "parser_cocci_menhir.ml" +# 20611 "parser_cocci_menhir.ml" ) = Obj.magic rp2 in let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in let lp2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 20616 "parser_cocci_menhir.ml" +# 20617 "parser_cocci_menhir.ml" ) = Obj.magic lp2 in let rp1 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 20621 "parser_cocci_menhir.ml" +# 20622 "parser_cocci_menhir.ml" ) = Obj.magic rp1 in let d : 'tv_d_ident = Obj.magic d in let st : ( # 99 "parser_cocci_menhir.mly" (Data.clt) -# 20627 "parser_cocci_menhir.ml" +# 20628 "parser_cocci_menhir.ml" ) = Obj.magic st in let lp1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 20632 "parser_cocci_menhir.ml" +# 20633 "parser_cocci_menhir.ml" ) = Obj.magic lp1 in let t : 'tv_fn_ctype = Obj.magic t in let _startpos = _startpos_t_ in @@ -20637,11 +20638,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 20641 "parser_cocci_menhir.ml" +# 20642 "parser_cocci_menhir.ml" in -# 1050 "parser_cocci_menhir.mly" +# 1051 "parser_cocci_menhir.mly" ( let (id,fn) = d in let t = Ast0.wrap @@ -20649,7 +20650,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1, P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv))) -# 20653 "parser_cocci_menhir.ml" +# 20654 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20725,40 +20726,40 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20729 "parser_cocci_menhir.ml" +# 20730 "parser_cocci_menhir.ml" ) = Obj.magic pv in let e : 'tv_initialize = Obj.magic e in let q : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 20735 "parser_cocci_menhir.ml" +# 20736 "parser_cocci_menhir.ml" ) = Obj.magic q in let rp2 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 20740 "parser_cocci_menhir.ml" +# 20741 "parser_cocci_menhir.ml" ) = Obj.magic rp2 in let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in let lp2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 20746 "parser_cocci_menhir.ml" +# 20747 "parser_cocci_menhir.ml" ) = Obj.magic lp2 in let rp1 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 20751 "parser_cocci_menhir.ml" +# 20752 "parser_cocci_menhir.ml" ) = Obj.magic rp1 in let d : 'tv_d_ident = Obj.magic d in let st : ( # 99 "parser_cocci_menhir.mly" (Data.clt) -# 20757 "parser_cocci_menhir.ml" +# 20758 "parser_cocci_menhir.ml" ) = Obj.magic st in let lp1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 20762 "parser_cocci_menhir.ml" +# 20763 "parser_cocci_menhir.ml" ) = Obj.magic lp1 in let t : 'tv_fn_ctype = Obj.magic t in let x0 : 'tv_storage = Obj.magic x0 in @@ -20769,11 +20770,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 20773 "parser_cocci_menhir.ml" +# 20774 "parser_cocci_menhir.ml" in -# 1050 "parser_cocci_menhir.mly" +# 1051 "parser_cocci_menhir.mly" ( let (id,fn) = d in let t = Ast0.wrap @@ -20781,7 +20782,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1, P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv))) -# 20785 "parser_cocci_menhir.ml" +# 20786 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20798,7 +20799,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_option_TLocal_ = # 29 "standard.mly" ( None ) -# 20802 "parser_cocci_menhir.ml" +# 20803 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20822,7 +20823,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_option_TLocal_ = # 31 "standard.mly" ( Some x ) -# 20826 "parser_cocci_menhir.ml" +# 20827 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20839,7 +20840,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_option_TPosAny_ = # 29 "standard.mly" ( None ) -# 20843 "parser_cocci_menhir.ml" +# 20844 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20863,7 +20864,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_option_TPosAny_ = # 31 "standard.mly" ( Some x ) -# 20867 "parser_cocci_menhir.ml" +# 20868 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20880,7 +20881,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_option_eexpr_ = # 29 "standard.mly" ( None ) -# 20884 "parser_cocci_menhir.ml" +# 20885 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20904,7 +20905,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_option_eexpr_ = # 31 "standard.mly" ( Some x ) -# 20908 "parser_cocci_menhir.ml" +# 20909 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20919,9 +20920,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_plus_after_dots = -# 1673 "parser_cocci_menhir.mly" +# 1674 "parser_cocci_menhir.mly" ([]) -# 20925 "parser_cocci_menhir.ml" +# 20926 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20947,9 +20948,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_plus_after_dots = -# 1674 "parser_cocci_menhir.mly" +# 1675 "parser_cocci_menhir.mly" (_2) -# 20953 "parser_cocci_menhir.ml" +# 20954 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -20977,9 +20978,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_plus_after_dots = -# 1676 "parser_cocci_menhir.mly" +# 1677 "parser_cocci_menhir.mly" ( (Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Exp(_1)))))::_2 ) -# 20983 "parser_cocci_menhir.ml" +# 20984 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21007,9 +21008,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_plus_after_dots = -# 1677 "parser_cocci_menhir.mly" +# 1678 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DECL(_1))::_2 ) -# 21013 "parser_cocci_menhir.ml" +# 21014 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21037,9 +21038,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_plus_after_dots = -# 1679 "parser_cocci_menhir.mly" +# 1680 "parser_cocci_menhir.mly" ( (List.map (function x -> Ast0.wrap(Ast0.OTHER(x))) _1)@_2 ) -# 21043 "parser_cocci_menhir.ml" +# 21044 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21054,9 +21055,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_plus_after_exp = -# 1669 "parser_cocci_menhir.mly" +# 1670 "parser_cocci_menhir.mly" ([]) -# 21060 "parser_cocci_menhir.ml" +# 21061 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21084,9 +21085,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_plus_after_exp = -# 1670 "parser_cocci_menhir.mly" +# 1671 "parser_cocci_menhir.mly" ( (Ast0.wrap(Ast0.OTHER(_1)))::_2 ) -# 21090 "parser_cocci_menhir.ml" +# 21091 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21101,9 +21102,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_plus_after_stm = -# 1682 "parser_cocci_menhir.mly" +# 1683 "parser_cocci_menhir.mly" ([]) -# 21107 "parser_cocci_menhir.ml" +# 21108 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21131,9 +21132,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_plus_after_stm = -# 1683 "parser_cocci_menhir.mly" +# 1684 "parser_cocci_menhir.mly" ( (Ast0.wrap(Ast0.OTHER(_1)))::_2 ) -# 21137 "parser_cocci_menhir.ml" +# 21138 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21161,9 +21162,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_plus_after_stm = -# 1684 "parser_cocci_menhir.mly" +# 1685 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DECL(_1))::_2 ) -# 21167 "parser_cocci_menhir.ml" +# 21168 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21191,9 +21192,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_plus_after_stm = -# 1686 "parser_cocci_menhir.mly" +# 1687 "parser_cocci_menhir.mly" ( (List.map (function x -> Ast0.wrap(Ast0.OTHER(x))) _1)@_2 ) -# 21197 "parser_cocci_menhir.ml" +# 21198 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21229,7 +21230,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_plus_body = # 614 "parser_cocci_menhir.mly" ( Top_level.top_level (f@b@ew) ) -# 21233 "parser_cocci_menhir.ml" +# 21234 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21265,7 +21266,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_plus_exp_body = # 628 "parser_cocci_menhir.mly" ( Top_level.top_level (f@[b]@ew) ) -# 21269 "parser_cocci_menhir.ml" +# 21270 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21293,11 +21294,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 143 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 21297 "parser_cocci_menhir.ml" +# 21298 "parser_cocci_menhir.ml" ) = # 179 "parser_cocci_menhir.mly" ( _1 ) -# 21301 "parser_cocci_menhir.ml" +# 21302 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21325,11 +21326,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 143 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 21329 "parser_cocci_menhir.ml" +# 21330 "parser_cocci_menhir.ml" ) = # 179 "parser_cocci_menhir.mly" ( p ) -# 21333 "parser_cocci_menhir.ml" +# 21334 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21357,11 +21358,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 143 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 21361 "parser_cocci_menhir.ml" +# 21362 "parser_cocci_menhir.ml" ) = # 180 "parser_cocci_menhir.mly" ( p ) -# 21365 "parser_cocci_menhir.ml" +# 21366 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21389,11 +21390,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 140 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 21393 "parser_cocci_menhir.ml" +# 21394 "parser_cocci_menhir.ml" ) = # 175 "parser_cocci_menhir.mly" ( _1 ) -# 21397 "parser_cocci_menhir.ml" +# 21398 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21421,11 +21422,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 140 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 21425 "parser_cocci_menhir.ml" +# 21426 "parser_cocci_menhir.ml" ) = # 175 "parser_cocci_menhir.mly" ( p ) -# 21429 "parser_cocci_menhir.ml" +# 21430 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21453,11 +21454,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 140 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 21457 "parser_cocci_menhir.ml" +# 21458 "parser_cocci_menhir.ml" ) = # 176 "parser_cocci_menhir.mly" ( p ) -# 21461 "parser_cocci_menhir.ml" +# 21462 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21479,9 +21480,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_plus_start = -# 1658 "parser_cocci_menhir.mly" +# 1659 "parser_cocci_menhir.mly" ( [Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Ty(_1))))] ) -# 21485 "parser_cocci_menhir.ml" +# 21486 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21503,9 +21504,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_plus_start = -# 1659 "parser_cocci_menhir.mly" +# 1660 "parser_cocci_menhir.mly" ( [Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.TopInit(_1))))] ) -# 21509 "parser_cocci_menhir.ml" +# 21510 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21533,9 +21534,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_plus_start = -# 1661 "parser_cocci_menhir.mly" +# 1662 "parser_cocci_menhir.mly" ( (Ast0.wrap(Ast0.OTHER(_1)))::_2 ) -# 21539 "parser_cocci_menhir.ml" +# 21540 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21563,9 +21564,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_plus_start = -# 1663 "parser_cocci_menhir.mly" +# 1664 "parser_cocci_menhir.mly" ( (Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Exp(_1)))))::_2 ) -# 21569 "parser_cocci_menhir.ml" +# 21570 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21593,9 +21594,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_plus_start = -# 1664 "parser_cocci_menhir.mly" +# 1665 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DECL(_1))::_2 ) -# 21599 "parser_cocci_menhir.ml" +# 21600 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21623,9 +21624,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_plus_start = -# 1666 "parser_cocci_menhir.mly" +# 1667 "parser_cocci_menhir.mly" ( (List.map (function x -> Ast0.wrap(Ast0.OTHER(x))) _1)@_2 ) -# 21629 "parser_cocci_menhir.ml" +# 21630 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21646,14 +21647,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 47 "parser_cocci_menhir.mly" (string) -# 21650 "parser_cocci_menhir.ml" +# 21651 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_pnrule = # 230 "parser_cocci_menhir.mly" ( Ast.Dep _1 ) -# 21657 "parser_cocci_menhir.ml" +# 21658 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21678,14 +21679,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 47 "parser_cocci_menhir.mly" (string) -# 21682 "parser_cocci_menhir.ml" +# 21683 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_pnrule = # 231 "parser_cocci_menhir.mly" ( Ast.AntiDep _2 ) -# 21689 "parser_cocci_menhir.ml" +# 21690 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21710,14 +21711,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 47 "parser_cocci_menhir.mly" (string) -# 21714 "parser_cocci_menhir.ml" +# 21715 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_pnrule = # 232 "parser_cocci_menhir.mly" ( Ast.EverDep _2 ) -# 21721 "parser_cocci_menhir.ml" +# 21722 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21742,14 +21743,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 47 "parser_cocci_menhir.mly" (string) -# 21746 "parser_cocci_menhir.ml" +# 21747 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_pnrule = # 233 "parser_cocci_menhir.mly" ( Ast.NeverDep _2 ) -# 21753 "parser_cocci_menhir.ml" +# 21754 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21781,7 +21782,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_pnrule = # 234 "parser_cocci_menhir.mly" ( _2 ) -# 21785 "parser_cocci_menhir.ml" +# 21786 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21803,9 +21804,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = -# 1322 "parser_cocci_menhir.mly" +# 1323 "parser_cocci_menhir.mly" ( _1 ) -# 21809 "parser_cocci_menhir.ml" +# 21810 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21841,22 +21842,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _4 : ( # 102 "parser_cocci_menhir.mly" (Data.clt) -# 21845 "parser_cocci_menhir.ml" +# 21846 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr = Obj.magic _3 in let _2 : ( # 102 "parser_cocci_menhir.mly" (Data.clt) -# 21851 "parser_cocci_menhir.ml" +# 21852 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = -# 1324 "parser_cocci_menhir.mly" +# 1325 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.ArrayAccess (_1,P.clt2mcode "[" _2,_3, P.clt2mcode "]" _4)) ) -# 21860 "parser_cocci_menhir.ml" +# 21861 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21888,15 +21889,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 21892 "parser_cocci_menhir.ml" +# 21893 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = -# 1327 "parser_cocci_menhir.mly" +# 1328 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.RecordAccess(_1, P.clt2mcode "." _2, _3)) ) -# 21900 "parser_cocci_menhir.ml" +# 21901 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21928,16 +21929,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 104 "parser_cocci_menhir.mly" (Data.clt) -# 21932 "parser_cocci_menhir.ml" +# 21933 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = -# 1329 "parser_cocci_menhir.mly" +# 1330 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.RecordPtAccess(_1, P.clt2mcode "->" _2, _3)) ) -# 21941 "parser_cocci_menhir.ml" +# 21942 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21963,15 +21964,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 21967 "parser_cocci_menhir.ml" +# 21968 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = -# 1332 "parser_cocci_menhir.mly" +# 1333 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Inc _2)) ) -# 21975 "parser_cocci_menhir.ml" +# 21976 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -21997,15 +21998,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 22001 "parser_cocci_menhir.ml" +# 22002 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = -# 1334 "parser_cocci_menhir.mly" +# 1335 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Dec _2)) ) -# 22009 "parser_cocci_menhir.ml" +# 22010 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22041,23 +22042,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _4 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 22045 "parser_cocci_menhir.ml" +# 22046 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr_list_option = Obj.magic _3 in let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 22051 "parser_cocci_menhir.ml" +# 22052 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = -# 1336 "parser_cocci_menhir.mly" +# 1337 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.FunCall(_1,P.clt2mcode "(" _2, _3, P.clt2mcode ")" _4)) ) -# 22061 "parser_cocci_menhir.ml" +# 22062 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22079,9 +22080,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_postfix_expr_eexpr_invalid_ = -# 1322 "parser_cocci_menhir.mly" +# 1323 "parser_cocci_menhir.mly" ( _1 ) -# 22085 "parser_cocci_menhir.ml" +# 22086 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22117,22 +22118,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _4 : ( # 102 "parser_cocci_menhir.mly" (Data.clt) -# 22121 "parser_cocci_menhir.ml" +# 22122 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr = Obj.magic _3 in let _2 : ( # 102 "parser_cocci_menhir.mly" (Data.clt) -# 22127 "parser_cocci_menhir.ml" +# 22128 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_postfix_expr_eexpr_invalid_ = -# 1324 "parser_cocci_menhir.mly" +# 1325 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.ArrayAccess (_1,P.clt2mcode "[" _2,_3, P.clt2mcode "]" _4)) ) -# 22136 "parser_cocci_menhir.ml" +# 22137 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22164,15 +22165,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 22168 "parser_cocci_menhir.ml" +# 22169 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_postfix_expr_eexpr_invalid_ = -# 1327 "parser_cocci_menhir.mly" +# 1328 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.RecordAccess(_1, P.clt2mcode "." _2, _3)) ) -# 22176 "parser_cocci_menhir.ml" +# 22177 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22204,16 +22205,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 104 "parser_cocci_menhir.mly" (Data.clt) -# 22208 "parser_cocci_menhir.ml" +# 22209 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_postfix_expr_eexpr_invalid_ = -# 1329 "parser_cocci_menhir.mly" +# 1330 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.RecordPtAccess(_1, P.clt2mcode "->" _2, _3)) ) -# 22217 "parser_cocci_menhir.ml" +# 22218 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22239,15 +22240,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 22243 "parser_cocci_menhir.ml" +# 22244 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_postfix_expr_eexpr_invalid_ = -# 1332 "parser_cocci_menhir.mly" +# 1333 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Inc _2)) ) -# 22251 "parser_cocci_menhir.ml" +# 22252 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22273,15 +22274,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 22277 "parser_cocci_menhir.ml" +# 22278 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_postfix_expr_eexpr_invalid_ = -# 1334 "parser_cocci_menhir.mly" +# 1335 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Dec _2)) ) -# 22285 "parser_cocci_menhir.ml" +# 22286 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22317,23 +22318,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _4 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 22321 "parser_cocci_menhir.ml" +# 22322 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr_list_option = Obj.magic _3 in let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 22327 "parser_cocci_menhir.ml" +# 22328 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_postfix_expr_eexpr_invalid_ = -# 1336 "parser_cocci_menhir.mly" +# 1337 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.FunCall(_1,P.clt2mcode "(" _2, _3, P.clt2mcode ")" _4)) ) -# 22337 "parser_cocci_menhir.ml" +# 22338 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22355,9 +22356,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = -# 1322 "parser_cocci_menhir.mly" +# 1323 "parser_cocci_menhir.mly" ( _1 ) -# 22361 "parser_cocci_menhir.ml" +# 22362 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22393,22 +22394,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _4 : ( # 102 "parser_cocci_menhir.mly" (Data.clt) -# 22397 "parser_cocci_menhir.ml" +# 22398 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr = Obj.magic _3 in let _2 : ( # 102 "parser_cocci_menhir.mly" (Data.clt) -# 22403 "parser_cocci_menhir.ml" +# 22404 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = -# 1324 "parser_cocci_menhir.mly" +# 1325 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.ArrayAccess (_1,P.clt2mcode "[" _2,_3, P.clt2mcode "]" _4)) ) -# 22412 "parser_cocci_menhir.ml" +# 22413 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22440,15 +22441,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 22444 "parser_cocci_menhir.ml" +# 22445 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = -# 1327 "parser_cocci_menhir.mly" +# 1328 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.RecordAccess(_1, P.clt2mcode "." _2, _3)) ) -# 22452 "parser_cocci_menhir.ml" +# 22453 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22480,16 +22481,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 104 "parser_cocci_menhir.mly" (Data.clt) -# 22484 "parser_cocci_menhir.ml" +# 22485 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = -# 1329 "parser_cocci_menhir.mly" +# 1330 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.RecordPtAccess(_1, P.clt2mcode "->" _2, _3)) ) -# 22493 "parser_cocci_menhir.ml" +# 22494 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22515,15 +22516,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 22519 "parser_cocci_menhir.ml" +# 22520 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = -# 1332 "parser_cocci_menhir.mly" +# 1333 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Inc _2)) ) -# 22527 "parser_cocci_menhir.ml" +# 22528 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22549,15 +22550,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 22553 "parser_cocci_menhir.ml" +# 22554 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = -# 1334 "parser_cocci_menhir.mly" +# 1335 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Dec _2)) ) -# 22561 "parser_cocci_menhir.ml" +# 22562 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22593,23 +22594,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _4 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 22597 "parser_cocci_menhir.ml" +# 22598 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr_list_option = Obj.magic _3 in let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 22603 "parser_cocci_menhir.ml" +# 22604 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = -# 1336 "parser_cocci_menhir.mly" +# 1337 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.FunCall(_1,P.clt2mcode "(" _2, _3, P.clt2mcode ")" _4)) ) -# 22613 "parser_cocci_menhir.ml" +# 22614 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22631,9 +22632,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_postfix_expr_expr_invalid_ = -# 1322 "parser_cocci_menhir.mly" +# 1323 "parser_cocci_menhir.mly" ( _1 ) -# 22637 "parser_cocci_menhir.ml" +# 22638 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22669,22 +22670,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _4 : ( # 102 "parser_cocci_menhir.mly" (Data.clt) -# 22673 "parser_cocci_menhir.ml" +# 22674 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr = Obj.magic _3 in let _2 : ( # 102 "parser_cocci_menhir.mly" (Data.clt) -# 22679 "parser_cocci_menhir.ml" +# 22680 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_postfix_expr_expr_invalid_ = -# 1324 "parser_cocci_menhir.mly" +# 1325 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.ArrayAccess (_1,P.clt2mcode "[" _2,_3, P.clt2mcode "]" _4)) ) -# 22688 "parser_cocci_menhir.ml" +# 22689 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22716,15 +22717,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 22720 "parser_cocci_menhir.ml" +# 22721 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_postfix_expr_expr_invalid_ = -# 1327 "parser_cocci_menhir.mly" +# 1328 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.RecordAccess(_1, P.clt2mcode "." _2, _3)) ) -# 22728 "parser_cocci_menhir.ml" +# 22729 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22756,16 +22757,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 104 "parser_cocci_menhir.mly" (Data.clt) -# 22760 "parser_cocci_menhir.ml" +# 22761 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_postfix_expr_expr_invalid_ = -# 1329 "parser_cocci_menhir.mly" +# 1330 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.RecordPtAccess(_1, P.clt2mcode "->" _2, _3)) ) -# 22769 "parser_cocci_menhir.ml" +# 22770 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22791,15 +22792,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 22795 "parser_cocci_menhir.ml" +# 22796 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_postfix_expr_expr_invalid_ = -# 1332 "parser_cocci_menhir.mly" +# 1333 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Inc _2)) ) -# 22803 "parser_cocci_menhir.ml" +# 22804 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22825,15 +22826,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 22829 "parser_cocci_menhir.ml" +# 22830 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_postfix_expr_expr_invalid_ = -# 1334 "parser_cocci_menhir.mly" +# 1335 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Dec _2)) ) -# 22837 "parser_cocci_menhir.ml" +# 22838 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22869,23 +22870,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _4 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 22873 "parser_cocci_menhir.ml" +# 22874 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr_list_option = Obj.magic _3 in let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 22879 "parser_cocci_menhir.ml" +# 22880 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : 'tv_postfix_expr_expr_invalid_ = -# 1336 "parser_cocci_menhir.mly" +# 1337 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.FunCall(_1,P.clt2mcode "(" _2, _3, P.clt2mcode ")" _4)) ) -# 22889 "parser_cocci_menhir.ml" +# 22890 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22907,9 +22908,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1341 "parser_cocci_menhir.mly" +# 1342 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Ident(_1)) ) -# 22913 "parser_cocci_menhir.ml" +# 22914 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22930,15 +22931,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 22934 "parser_cocci_menhir.ml" +# 22935 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1343 "parser_cocci_menhir.mly" +# 1344 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) ) -# 22942 "parser_cocci_menhir.ml" +# 22943 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22959,15 +22960,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 22963 "parser_cocci_menhir.ml" +# 22964 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1346 "parser_cocci_menhir.mly" +# 1347 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Float x) clt)) ) -# 22971 "parser_cocci_menhir.ml" +# 22972 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -22988,15 +22989,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 22992 "parser_cocci_menhir.ml" +# 22993 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1349 "parser_cocci_menhir.mly" +# 1350 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.String x) clt)) ) -# 23000 "parser_cocci_menhir.ml" +# 23001 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23017,15 +23018,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 23021 "parser_cocci_menhir.ml" +# 23022 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1352 "parser_cocci_menhir.mly" +# 1353 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Char x) clt)) ) -# 23029 "parser_cocci_menhir.ml" +# 23030 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23046,16 +23047,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 23050 "parser_cocci_menhir.ml" +# 23051 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1355 "parser_cocci_menhir.mly" +# 1356 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) ) -# 23059 "parser_cocci_menhir.ml" +# 23060 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23076,15 +23077,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 63 "parser_cocci_menhir.mly" (Parse_aux.expinfo) -# 23080 "parser_cocci_menhir.ml" +# 23081 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1359 "parser_cocci_menhir.mly" +# 1360 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,clt) = _1 in Ast0.wrap(Ast0.MetaErr(P.clt2mcode nm clt,constraints,pure)) ) -# 23088 "parser_cocci_menhir.ml" +# 23089 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23105,16 +23106,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 23109 "parser_cocci_menhir.ml" +# 23110 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1362 "parser_cocci_menhir.mly" +# 1363 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) ) -# 23118 "parser_cocci_menhir.ml" +# 23119 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23135,16 +23136,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 23139 "parser_cocci_menhir.ml" +# 23140 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1366 "parser_cocci_menhir.mly" +# 1367 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) ) -# 23148 "parser_cocci_menhir.ml" +# 23149 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23165,16 +23166,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 23169 "parser_cocci_menhir.ml" +# 23170 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1370 "parser_cocci_menhir.mly" +# 1371 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.LocalID,pure)) ) -# 23178 "parser_cocci_menhir.ml" +# 23179 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23205,21 +23206,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 23209 "parser_cocci_menhir.ml" +# 23210 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_eexpr = Obj.magic _2 in let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 23215 "parser_cocci_menhir.ml" +# 23216 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1374 "parser_cocci_menhir.mly" +# 1375 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Paren(P.clt2mcode "(" _1,_2, P.clt2mcode ")" _3)) ) -# 23223 "parser_cocci_menhir.ml" +# 23224 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23250,23 +23251,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 23254 "parser_cocci_menhir.ml" +# 23255 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_midzero_list_eexpr_eexpr_ = Obj.magic _2 in let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 23260 "parser_cocci_menhir.ml" +# 23261 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1377 "parser_cocci_menhir.mly" +# 1378 "parser_cocci_menhir.mly" ( let (mids,code) = _2 in Ast0.wrap(Ast0.DisjExpr(P.clt2mcode "(" _1, code, mids, P.clt2mcode ")" _3)) ) -# 23270 "parser_cocci_menhir.ml" +# 23271 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23288,9 +23289,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_dot_expressions_ = -# 1381 "parser_cocci_menhir.mly" +# 1382 "parser_cocci_menhir.mly" ( _1 ) -# 23294 "parser_cocci_menhir.ml" +# 23295 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23312,9 +23313,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1341 "parser_cocci_menhir.mly" +# 1342 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Ident(_1)) ) -# 23318 "parser_cocci_menhir.ml" +# 23319 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23335,15 +23336,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 23339 "parser_cocci_menhir.ml" +# 23340 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1343 "parser_cocci_menhir.mly" +# 1344 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) ) -# 23347 "parser_cocci_menhir.ml" +# 23348 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23364,15 +23365,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 23368 "parser_cocci_menhir.ml" +# 23369 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1346 "parser_cocci_menhir.mly" +# 1347 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Float x) clt)) ) -# 23376 "parser_cocci_menhir.ml" +# 23377 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23393,15 +23394,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 23397 "parser_cocci_menhir.ml" +# 23398 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1349 "parser_cocci_menhir.mly" +# 1350 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.String x) clt)) ) -# 23405 "parser_cocci_menhir.ml" +# 23406 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23422,15 +23423,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 23426 "parser_cocci_menhir.ml" +# 23427 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1352 "parser_cocci_menhir.mly" +# 1353 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Char x) clt)) ) -# 23434 "parser_cocci_menhir.ml" +# 23435 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23451,16 +23452,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 23455 "parser_cocci_menhir.ml" +# 23456 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1355 "parser_cocci_menhir.mly" +# 1356 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) ) -# 23464 "parser_cocci_menhir.ml" +# 23465 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23481,15 +23482,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 63 "parser_cocci_menhir.mly" (Parse_aux.expinfo) -# 23485 "parser_cocci_menhir.ml" +# 23486 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1359 "parser_cocci_menhir.mly" +# 1360 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,clt) = _1 in Ast0.wrap(Ast0.MetaErr(P.clt2mcode nm clt,constraints,pure)) ) -# 23493 "parser_cocci_menhir.ml" +# 23494 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23510,16 +23511,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 23514 "parser_cocci_menhir.ml" +# 23515 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1362 "parser_cocci_menhir.mly" +# 1363 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) ) -# 23523 "parser_cocci_menhir.ml" +# 23524 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23540,16 +23541,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 23544 "parser_cocci_menhir.ml" +# 23545 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1366 "parser_cocci_menhir.mly" +# 1367 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) ) -# 23553 "parser_cocci_menhir.ml" +# 23554 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23570,16 +23571,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 23574 "parser_cocci_menhir.ml" +# 23575 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1370 "parser_cocci_menhir.mly" +# 1371 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.LocalID,pure)) ) -# 23583 "parser_cocci_menhir.ml" +# 23584 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23610,21 +23611,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 23614 "parser_cocci_menhir.ml" +# 23615 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_eexpr = Obj.magic _2 in let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 23620 "parser_cocci_menhir.ml" +# 23621 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1374 "parser_cocci_menhir.mly" +# 1375 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Paren(P.clt2mcode "(" _1,_2, P.clt2mcode ")" _3)) ) -# 23628 "parser_cocci_menhir.ml" +# 23629 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23655,23 +23656,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 23659 "parser_cocci_menhir.ml" +# 23660 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_midzero_list_eexpr_eexpr_ = Obj.magic _2 in let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 23665 "parser_cocci_menhir.ml" +# 23666 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1377 "parser_cocci_menhir.mly" +# 1378 "parser_cocci_menhir.mly" ( let (mids,code) = _2 in Ast0.wrap(Ast0.DisjExpr(P.clt2mcode "(" _1, code, mids, P.clt2mcode ")" _3)) ) -# 23675 "parser_cocci_menhir.ml" +# 23676 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23693,9 +23694,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_invalid_ = -# 1381 "parser_cocci_menhir.mly" +# 1382 "parser_cocci_menhir.mly" ( _1 ) -# 23699 "parser_cocci_menhir.ml" +# 23700 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23717,9 +23718,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1341 "parser_cocci_menhir.mly" +# 1342 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Ident(_1)) ) -# 23723 "parser_cocci_menhir.ml" +# 23724 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23740,15 +23741,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 23744 "parser_cocci_menhir.ml" +# 23745 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1343 "parser_cocci_menhir.mly" +# 1344 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) ) -# 23752 "parser_cocci_menhir.ml" +# 23753 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23769,15 +23770,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 23773 "parser_cocci_menhir.ml" +# 23774 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1346 "parser_cocci_menhir.mly" +# 1347 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Float x) clt)) ) -# 23781 "parser_cocci_menhir.ml" +# 23782 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23798,15 +23799,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 23802 "parser_cocci_menhir.ml" +# 23803 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1349 "parser_cocci_menhir.mly" +# 1350 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.String x) clt)) ) -# 23810 "parser_cocci_menhir.ml" +# 23811 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23827,15 +23828,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 23831 "parser_cocci_menhir.ml" +# 23832 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1352 "parser_cocci_menhir.mly" +# 1353 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Char x) clt)) ) -# 23839 "parser_cocci_menhir.ml" +# 23840 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23856,16 +23857,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 23860 "parser_cocci_menhir.ml" +# 23861 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1355 "parser_cocci_menhir.mly" +# 1356 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) ) -# 23869 "parser_cocci_menhir.ml" +# 23870 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23886,15 +23887,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 63 "parser_cocci_menhir.mly" (Parse_aux.expinfo) -# 23890 "parser_cocci_menhir.ml" +# 23891 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1359 "parser_cocci_menhir.mly" +# 1360 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,clt) = _1 in Ast0.wrap(Ast0.MetaErr(P.clt2mcode nm clt,constraints,pure)) ) -# 23898 "parser_cocci_menhir.ml" +# 23899 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23915,16 +23916,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 23919 "parser_cocci_menhir.ml" +# 23920 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1362 "parser_cocci_menhir.mly" +# 1363 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) ) -# 23928 "parser_cocci_menhir.ml" +# 23929 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23945,16 +23946,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 23949 "parser_cocci_menhir.ml" +# 23950 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1366 "parser_cocci_menhir.mly" +# 1367 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) ) -# 23958 "parser_cocci_menhir.ml" +# 23959 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -23975,16 +23976,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 23979 "parser_cocci_menhir.ml" +# 23980 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1370 "parser_cocci_menhir.mly" +# 1371 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.LocalID,pure)) ) -# 23988 "parser_cocci_menhir.ml" +# 23989 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24015,21 +24016,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 24019 "parser_cocci_menhir.ml" +# 24020 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_eexpr = Obj.magic _2 in let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 24025 "parser_cocci_menhir.ml" +# 24026 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1374 "parser_cocci_menhir.mly" +# 1375 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Paren(P.clt2mcode "(" _1,_2, P.clt2mcode ")" _3)) ) -# 24033 "parser_cocci_menhir.ml" +# 24034 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24060,23 +24061,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 24064 "parser_cocci_menhir.ml" +# 24065 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_midzero_list_eexpr_eexpr_ = Obj.magic _2 in let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 24070 "parser_cocci_menhir.ml" +# 24071 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1377 "parser_cocci_menhir.mly" +# 1378 "parser_cocci_menhir.mly" ( let (mids,code) = _2 in Ast0.wrap(Ast0.DisjExpr(P.clt2mcode "(" _1, code, mids, P.clt2mcode ")" _3)) ) -# 24080 "parser_cocci_menhir.ml" +# 24081 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24098,9 +24099,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_eexpr_nest_expressions_ = -# 1381 "parser_cocci_menhir.mly" +# 1382 "parser_cocci_menhir.mly" ( _1 ) -# 24104 "parser_cocci_menhir.ml" +# 24105 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24122,9 +24123,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1341 "parser_cocci_menhir.mly" +# 1342 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Ident(_1)) ) -# 24128 "parser_cocci_menhir.ml" +# 24129 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24145,15 +24146,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 24149 "parser_cocci_menhir.ml" +# 24150 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1343 "parser_cocci_menhir.mly" +# 1344 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) ) -# 24157 "parser_cocci_menhir.ml" +# 24158 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24174,15 +24175,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 24178 "parser_cocci_menhir.ml" +# 24179 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1346 "parser_cocci_menhir.mly" +# 1347 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Float x) clt)) ) -# 24186 "parser_cocci_menhir.ml" +# 24187 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24203,15 +24204,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 24207 "parser_cocci_menhir.ml" +# 24208 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1349 "parser_cocci_menhir.mly" +# 1350 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.String x) clt)) ) -# 24215 "parser_cocci_menhir.ml" +# 24216 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24232,15 +24233,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 24236 "parser_cocci_menhir.ml" +# 24237 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1352 "parser_cocci_menhir.mly" +# 1353 "parser_cocci_menhir.mly" ( let (x,clt) = _1 in Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Char x) clt)) ) -# 24244 "parser_cocci_menhir.ml" +# 24245 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24261,16 +24262,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 24265 "parser_cocci_menhir.ml" +# 24266 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1355 "parser_cocci_menhir.mly" +# 1356 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) ) -# 24274 "parser_cocci_menhir.ml" +# 24275 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24291,15 +24292,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 63 "parser_cocci_menhir.mly" (Parse_aux.expinfo) -# 24295 "parser_cocci_menhir.ml" +# 24296 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1359 "parser_cocci_menhir.mly" +# 1360 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,clt) = _1 in Ast0.wrap(Ast0.MetaErr(P.clt2mcode nm clt,constraints,pure)) ) -# 24303 "parser_cocci_menhir.ml" +# 24304 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24320,16 +24321,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 24324 "parser_cocci_menhir.ml" +# 24325 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1362 "parser_cocci_menhir.mly" +# 1363 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) ) -# 24333 "parser_cocci_menhir.ml" +# 24334 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24350,16 +24351,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 24354 "parser_cocci_menhir.ml" +# 24355 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1366 "parser_cocci_menhir.mly" +# 1367 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) ) -# 24363 "parser_cocci_menhir.ml" +# 24364 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24380,16 +24381,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 67 "parser_cocci_menhir.mly" (Parse_aux.typed_info) -# 24384 "parser_cocci_menhir.ml" +# 24385 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1370 "parser_cocci_menhir.mly" +# 1371 "parser_cocci_menhir.mly" ( let (nm,constraints,pure,ty,clt) = _1 in Ast0.wrap (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.LocalID,pure)) ) -# 24393 "parser_cocci_menhir.ml" +# 24394 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24420,21 +24421,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 24424 "parser_cocci_menhir.ml" +# 24425 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_eexpr = Obj.magic _2 in let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 24430 "parser_cocci_menhir.ml" +# 24431 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1374 "parser_cocci_menhir.mly" +# 1375 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Paren(P.clt2mcode "(" _1,_2, P.clt2mcode ")" _3)) ) -# 24438 "parser_cocci_menhir.ml" +# 24439 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24465,23 +24466,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 24469 "parser_cocci_menhir.ml" +# 24470 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_midzero_list_expr_eexpr_ = Obj.magic _2 in let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 24475 "parser_cocci_menhir.ml" +# 24476 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1377 "parser_cocci_menhir.mly" +# 1378 "parser_cocci_menhir.mly" ( let (mids,code) = _2 in Ast0.wrap(Ast0.DisjExpr(P.clt2mcode "(" _1, code, mids, P.clt2mcode ")" _3)) ) -# 24485 "parser_cocci_menhir.ml" +# 24486 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24503,9 +24504,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_primary_expr_expr_invalid_ = -# 1381 "parser_cocci_menhir.mly" +# 1382 "parser_cocci_menhir.mly" ( _1 ) -# 24509 "parser_cocci_menhir.ml" +# 24510 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24527,7 +24528,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_pure = # 190 "parser_cocci_menhir.mly" ( Ast0.Pure ) -# 24531 "parser_cocci_menhir.ml" +# 24532 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24549,7 +24550,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_pure = # 191 "parser_cocci_menhir.mly" ( Ast0.Context ) -# 24553 "parser_cocci_menhir.ml" +# 24554 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24575,7 +24576,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_pure = # 192 "parser_cocci_menhir.mly" ( Ast0.PureContext ) -# 24579 "parser_cocci_menhir.ml" +# 24580 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24601,7 +24602,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_pure = # 193 "parser_cocci_menhir.mly" ( Ast0.PureContext ) -# 24605 "parser_cocci_menhir.ml" +# 24606 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24618,7 +24619,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_pure = # 194 "parser_cocci_menhir.mly" ( Ast0.Impure ) -# 24622 "parser_cocci_menhir.ml" +# 24623 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24639,14 +24640,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 59 "parser_cocci_menhir.mly" (string * Data.clt) -# 24643 "parser_cocci_menhir.ml" +# 24644 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_pure_ident = -# 1395 "parser_cocci_menhir.mly" +# 1396 "parser_cocci_menhir.mly" ( _1 ) -# 24650 "parser_cocci_menhir.ml" +# 24651 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24668,9 +24669,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_pure_ident_or_meta_ident = -# 1401 "parser_cocci_menhir.mly" +# 1402 "parser_cocci_menhir.mly" ( (None,P.id2name _1) ) -# 24674 "parser_cocci_menhir.ml" +# 24675 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24692,9 +24693,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_pure_ident_or_meta_ident = -# 1402 "parser_cocci_menhir.mly" +# 1403 "parser_cocci_menhir.mly" ( _1 ) -# 24698 "parser_cocci_menhir.ml" +# 24699 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24714,9 +24715,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_pure_ident_or_meta_ident = -# 1403 "parser_cocci_menhir.mly" +# 1404 "parser_cocci_menhir.mly" ( (None,"list") ) -# 24720 "parser_cocci_menhir.ml" +# 24721 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24736,9 +24737,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_pure_ident_or_meta_ident = -# 1404 "parser_cocci_menhir.mly" +# 1405 "parser_cocci_menhir.mly" ( (None,"error") ) -# 24742 "parser_cocci_menhir.ml" +# 24743 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24758,9 +24759,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_pure_ident_or_meta_ident = -# 1405 "parser_cocci_menhir.mly" +# 1406 "parser_cocci_menhir.mly" ( (None,"type") ) -# 24764 "parser_cocci_menhir.ml" +# 24765 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24780,9 +24781,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_pure_ident_or_meta_ident = -# 1406 "parser_cocci_menhir.mly" +# 1407 "parser_cocci_menhir.mly" ( (None,"name") ) -# 24786 "parser_cocci_menhir.ml" +# 24787 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24810,9 +24811,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_i_ in let _endpos = _endpos_l_ in let _v : 'tv_pure_ident_or_meta_ident_with_not_eq_not_ceq_ = -# 1413 "parser_cocci_menhir.mly" +# 1414 "parser_cocci_menhir.mly" ( (i,l) ) -# 24816 "parser_cocci_menhir.ml" +# 24817 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24840,9 +24841,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_i_ in let _endpos = _endpos_l_ in let _v : 'tv_pure_ident_or_meta_ident_with_not_eq_not_eq_ = -# 1413 "parser_cocci_menhir.mly" +# 1414 "parser_cocci_menhir.mly" ( (i,l) ) -# 24846 "parser_cocci_menhir.ml" +# 24847 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24870,9 +24871,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_i_ in let _endpos = _endpos_l_ in let _v : 'tv_pure_ident_or_meta_ident_with_not_eq_not_eqe_ = -# 1413 "parser_cocci_menhir.mly" +# 1414 "parser_cocci_menhir.mly" ( (i,l) ) -# 24876 "parser_cocci_menhir.ml" +# 24877 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24900,9 +24901,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos_i_ in let _endpos = _endpos_l_ in let _v : 'tv_pure_ident_or_meta_ident_with_not_eq_not_pos_ = -# 1413 "parser_cocci_menhir.mly" +# 1414 "parser_cocci_menhir.mly" ( (i,l) ) -# 24906 "parser_cocci_menhir.ml" +# 24907 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24924,9 +24925,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_pure_ident_or_meta_ident_with_seed = -# 1409 "parser_cocci_menhir.mly" +# 1410 "parser_cocci_menhir.mly" ( (_1,None) ) -# 24930 "parser_cocci_menhir.ml" +# 24931 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24956,15 +24957,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let s : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 24960 "parser_cocci_menhir.ml" +# 24961 "parser_cocci_menhir.ml" ) = Obj.magic s in let _1 : 'tv_pure_ident_or_meta_ident = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos_s_ in let _v : 'tv_pure_ident_or_meta_ident_with_seed = -# 1410 "parser_cocci_menhir.mly" +# 1411 "parser_cocci_menhir.mly" ( (_1,Some (P.id2name s)) ) -# 24968 "parser_cocci_menhir.ml" +# 24969 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -24981,11 +24982,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 131 "parser_cocci_menhir.mly" (unit) -# 24985 "parser_cocci_menhir.ml" +# 24986 "parser_cocci_menhir.ml" ) = # 172 "parser_cocci_menhir.mly" ( ) -# 24989 "parser_cocci_menhir.ml" +# 24990 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25007,9 +25008,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_rule_elem_statement = -# 915 "parser_cocci_menhir.mly" +# 916 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Decl((Ast0.default_info(),Ast0.context_befaft()),_1)) ) -# 25013 "parser_cocci_menhir.ml" +# 25014 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25035,15 +25036,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 25039 "parser_cocci_menhir.ml" +# 25040 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_expr = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_rule_elem_statement = -# 916 "parser_cocci_menhir.mly" +# 917 "parser_cocci_menhir.mly" ( P.exp_stm _1 _2 ) -# 25047 "parser_cocci_menhir.ml" +# 25048 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25074,20 +25075,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 25078 "parser_cocci_menhir.ml" +# 25079 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_eexpr = Obj.magic _2 in let _1 : ( # 57 "parser_cocci_menhir.mly" (Data.clt) -# 25084 "parser_cocci_menhir.ml" +# 25085 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_rule_elem_statement = -# 917 "parser_cocci_menhir.mly" +# 918 "parser_cocci_menhir.mly" ( P.ret_exp _1 _2 _3 ) -# 25091 "parser_cocci_menhir.ml" +# 25092 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25113,19 +25114,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 25117 "parser_cocci_menhir.ml" +# 25118 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 57 "parser_cocci_menhir.mly" (Data.clt) -# 25122 "parser_cocci_menhir.ml" +# 25123 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_rule_elem_statement = -# 918 "parser_cocci_menhir.mly" +# 919 "parser_cocci_menhir.mly" ( P.ret _1 _2 ) -# 25129 "parser_cocci_menhir.ml" +# 25130 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25151,19 +25152,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 25155 "parser_cocci_menhir.ml" +# 25156 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 25160 "parser_cocci_menhir.ml" +# 25161 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_rule_elem_statement = -# 919 "parser_cocci_menhir.mly" +# 920 "parser_cocci_menhir.mly" ( P.break _1 _2 ) -# 25167 "parser_cocci_menhir.ml" +# 25168 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25189,19 +25190,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 25193 "parser_cocci_menhir.ml" +# 25194 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 25198 "parser_cocci_menhir.ml" +# 25199 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_rule_elem_statement = -# 920 "parser_cocci_menhir.mly" +# 921 "parser_cocci_menhir.mly" ( P.cont _1 _2 ) -# 25205 "parser_cocci_menhir.ml" +# 25206 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25232,24 +25233,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 25236 "parser_cocci_menhir.ml" +# 25237 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_midzero_list_rule_elem_statement_rule_elem_statement_ = Obj.magic _2 in let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 25242 "parser_cocci_menhir.ml" +# 25243 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_rule_elem_statement = -# 922 "parser_cocci_menhir.mly" +# 923 "parser_cocci_menhir.mly" ( let (mids,code) = _2 in Ast0.wrap (Ast0.Disj(P.clt2mcode "(" _1, List.map (function x -> Ast0.wrap(Ast0.DOTS([x]))) code, mids, P.clt2mcode ")" _3)) ) -# 25253 "parser_cocci_menhir.ml" +# 25254 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25305,18 +25306,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 153 "parser_cocci_menhir.mly" (Ast_cocci.rulename) -# 25309 "parser_cocci_menhir.ml" +# 25310 "parser_cocci_menhir.ml" ) = let nm = # 39 "standard.mly" ( None ) -# 25314 "parser_cocci_menhir.ml" +# 25315 "parser_cocci_menhir.ml" in # 202 "parser_cocci_menhir.mly" ( P.make_cocci_rule_name_result nm d i a e ee ) -# 25320 "parser_cocci_menhir.ml" +# 25321 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25378,19 +25379,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 153 "parser_cocci_menhir.mly" (Ast_cocci.rulename) -# 25382 "parser_cocci_menhir.ml" +# 25383 "parser_cocci_menhir.ml" ) = let nm = let x = x0 in # 41 "standard.mly" ( Some x ) -# 25388 "parser_cocci_menhir.ml" +# 25389 "parser_cocci_menhir.ml" in # 202 "parser_cocci_menhir.mly" ( P.make_cocci_rule_name_result nm d i a e ee ) -# 25394 "parser_cocci_menhir.ml" +# 25395 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25450,11 +25451,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 153 "parser_cocci_menhir.mly" (Ast_cocci.rulename) -# 25454 "parser_cocci_menhir.ml" +# 25455 "parser_cocci_menhir.ml" ) = # 207 "parser_cocci_menhir.mly" ( P.make_generated_rule_name_result None d i a e ee ) -# 25458 "parser_cocci_menhir.ml" +# 25459 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25496,11 +25497,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 153 "parser_cocci_menhir.mly" (Ast_cocci.rulename) -# 25500 "parser_cocci_menhir.ml" +# 25501 "parser_cocci_menhir.ml" ) = # 209 "parser_cocci_menhir.mly" ( P.make_script_rule_name_result lang d ) -# 25504 "parser_cocci_menhir.ml" +# 25505 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25536,11 +25537,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 153 "parser_cocci_menhir.mly" (Ast_cocci.rulename) -# 25540 "parser_cocci_menhir.ml" +# 25541 "parser_cocci_menhir.ml" ) = # 211 "parser_cocci_menhir.mly" ( P.make_initial_script_rule_name_result lang ) -# 25544 "parser_cocci_menhir.ml" +# 25545 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25576,11 +25577,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 153 "parser_cocci_menhir.mly" (Ast_cocci.rulename) -# 25580 "parser_cocci_menhir.ml" +# 25581 "parser_cocci_menhir.ml" ) = # 213 "parser_cocci_menhir.mly" ( P.make_final_script_rule_name_result lang ) -# 25584 "parser_cocci_menhir.ml" +# 25585 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25624,7 +25625,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 47 "parser_cocci_menhir.mly" (string) -# 25628 "parser_cocci_menhir.ml" +# 25629 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let py : 'tv_pure_ident = Obj.magic py in let _startpos = _startpos_py_ in @@ -25632,11 +25633,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : ( # 159 "parser_cocci_menhir.mly" (string * (string * string)) -# 25636 "parser_cocci_menhir.ml" +# 25637 "parser_cocci_menhir.ml" ) = -# 1873 "parser_cocci_menhir.mly" +# 1879 "parser_cocci_menhir.mly" ( (P.id2name py, (_3, P.id2name cocci)) ) -# 25640 "parser_cocci_menhir.ml" +# 25641 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25657,14 +25658,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let x : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 25661 "parser_cocci_menhir.ml" +# 25662 "parser_cocci_menhir.ml" ) = Obj.magic x in let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : 'tv_separated_nonempty_list_TComma_TString_ = # 144 "standard.mly" ( [ x ] ) -# 25668 "parser_cocci_menhir.ml" +# 25669 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25695,14 +25696,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let x : ( # 87 "parser_cocci_menhir.mly" (string * Data.clt) -# 25699 "parser_cocci_menhir.ml" +# 25700 "parser_cocci_menhir.ml" ) = Obj.magic x in let _startpos = _startpos_x_ in let _endpos = _endpos_xs_ in let _v : 'tv_separated_nonempty_list_TComma_TString_ = # 146 "standard.mly" ( x :: xs ) -# 25706 "parser_cocci_menhir.ml" +# 25707 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25726,7 +25727,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_any_strict_ = # 144 "standard.mly" ( [ x ] ) -# 25730 "parser_cocci_menhir.ml" +# 25731 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25760,7 +25761,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_any_strict_ = # 146 "standard.mly" ( x :: xs ) -# 25764 "parser_cocci_menhir.ml" +# 25765 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25784,7 +25785,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_ctype_ = # 144 "standard.mly" ( [ x ] ) -# 25788 "parser_cocci_menhir.ml" +# 25789 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25818,7 +25819,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_ctype_ = # 146 "standard.mly" ( x :: xs ) -# 25822 "parser_cocci_menhir.ml" +# 25823 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25842,7 +25843,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_d_ident_ = # 144 "standard.mly" ( [ x ] ) -# 25846 "parser_cocci_menhir.ml" +# 25847 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25876,7 +25877,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_d_ident_ = # 146 "standard.mly" ( x :: xs ) -# 25880 "parser_cocci_menhir.ml" +# 25881 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25900,7 +25901,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_dexpr_ = # 144 "standard.mly" ( [ x ] ) -# 25904 "parser_cocci_menhir.ml" +# 25905 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25934,7 +25935,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_dexpr_ = # 146 "standard.mly" ( x :: xs ) -# 25938 "parser_cocci_menhir.ml" +# 25939 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25958,7 +25959,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_ident_or_const_ = # 144 "standard.mly" ( [ x ] ) -# 25962 "parser_cocci_menhir.ml" +# 25963 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -25992,7 +25993,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_ident_or_const_ = # 146 "standard.mly" ( x :: xs ) -# 25996 "parser_cocci_menhir.ml" +# 25997 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26016,7 +26017,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_meta_ident_ = # 144 "standard.mly" ( [ x ] ) -# 26020 "parser_cocci_menhir.ml" +# 26021 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26050,7 +26051,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_meta_ident_ = # 146 "standard.mly" ( x :: xs ) -# 26054 "parser_cocci_menhir.ml" +# 26055 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26074,7 +26075,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_ = # 144 "standard.mly" ( [ x ] ) -# 26078 "parser_cocci_menhir.ml" +# 26079 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26108,7 +26109,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_ = # 146 "standard.mly" ( x :: xs ) -# 26112 "parser_cocci_menhir.ml" +# 26113 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26132,7 +26133,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_ = # 144 "standard.mly" ( [ x ] ) -# 26136 "parser_cocci_menhir.ml" +# 26137 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26166,7 +26167,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_ = # 146 "standard.mly" ( x :: xs ) -# 26170 "parser_cocci_menhir.ml" +# 26171 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26190,7 +26191,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_ceq__ = # 144 "standard.mly" ( [ x ] ) -# 26194 "parser_cocci_menhir.ml" +# 26195 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26224,7 +26225,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_ceq__ = # 146 "standard.mly" ( x :: xs ) -# 26228 "parser_cocci_menhir.ml" +# 26229 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26248,7 +26249,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_eq__ = # 144 "standard.mly" ( [ x ] ) -# 26252 "parser_cocci_menhir.ml" +# 26253 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26282,7 +26283,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_eq__ = # 146 "standard.mly" ( x :: xs ) -# 26286 "parser_cocci_menhir.ml" +# 26287 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26306,7 +26307,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_eqe__ = # 144 "standard.mly" ( [ x ] ) -# 26310 "parser_cocci_menhir.ml" +# 26311 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26340,7 +26341,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_eqe__ = # 146 "standard.mly" ( x :: xs ) -# 26344 "parser_cocci_menhir.ml" +# 26345 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26364,7 +26365,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_pos__ = # 144 "standard.mly" ( [ x ] ) -# 26368 "parser_cocci_menhir.ml" +# 26369 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26398,7 +26399,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_pos__ = # 146 "standard.mly" ( x :: xs ) -# 26402 "parser_cocci_menhir.ml" +# 26403 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26422,7 +26423,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_seed_ = # 144 "standard.mly" ( [ x ] ) -# 26426 "parser_cocci_menhir.ml" +# 26427 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26456,7 +26457,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_seed_ = # 146 "standard.mly" ( x :: xs ) -# 26460 "parser_cocci_menhir.ml" +# 26461 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26478,9 +26479,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_single_statement = -# 930 "parser_cocci_menhir.mly" +# 931 "parser_cocci_menhir.mly" ( _1 ) -# 26484 "parser_cocci_menhir.ml" +# 26485 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26511,24 +26512,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 26515 "parser_cocci_menhir.ml" +# 26516 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_midzero_list_statement_statement_ = Obj.magic _2 in let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 26521 "parser_cocci_menhir.ml" +# 26522 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_single_statement = -# 934 "parser_cocci_menhir.mly" +# 935 "parser_cocci_menhir.mly" ( let (mids,code) = _2 in Ast0.wrap (Ast0.Disj(P.clt2mcode "(" _1, List.map (function x -> Ast0.wrap(Ast0.DOTS([x]))) code, mids, P.clt2mcode ")" _3)) ) -# 26532 "parser_cocci_menhir.ml" +# 26533 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26550,9 +26551,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_statement = -# 857 "parser_cocci_menhir.mly" +# 858 "parser_cocci_menhir.mly" ( _1 ) -# 26556 "parser_cocci_menhir.ml" +# 26557 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26573,14 +26574,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 64 "parser_cocci_menhir.mly" (Parse_aux.info) -# 26577 "parser_cocci_menhir.ml" +# 26578 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_statement = -# 859 "parser_cocci_menhir.mly" +# 860 "parser_cocci_menhir.mly" ( P.meta_stm _1 ) -# 26584 "parser_cocci_menhir.ml" +# 26585 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26606,15 +26607,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 26610 "parser_cocci_menhir.ml" +# 26611 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_expr = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_statement = -# 861 "parser_cocci_menhir.mly" +# 862 "parser_cocci_menhir.mly" ( P.exp_stm _1 _2 ) -# 26618 "parser_cocci_menhir.ml" +# 26619 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26656,25 +26657,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _4 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 26660 "parser_cocci_menhir.ml" +# 26661 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr = Obj.magic _3 in let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 26666 "parser_cocci_menhir.ml" +# 26667 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 57 "parser_cocci_menhir.mly" (Data.clt) -# 26671 "parser_cocci_menhir.ml" +# 26672 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : 'tv_statement = -# 863 "parser_cocci_menhir.mly" +# 864 "parser_cocci_menhir.mly" ( P.ifthen _1 _2 _3 _4 _5 ) -# 26678 "parser_cocci_menhir.ml" +# 26679 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26726,31 +26727,31 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _6 : ( # 57 "parser_cocci_menhir.mly" (Data.clt) -# 26730 "parser_cocci_menhir.ml" +# 26731 "parser_cocci_menhir.ml" ) = Obj.magic _6 in let _5 : 'tv_single_statement = Obj.magic _5 in let _4 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 26736 "parser_cocci_menhir.ml" +# 26737 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr = Obj.magic _3 in let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 26742 "parser_cocci_menhir.ml" +# 26743 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 57 "parser_cocci_menhir.mly" (Data.clt) -# 26747 "parser_cocci_menhir.ml" +# 26748 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__7_ in let _v : 'tv_statement = -# 865 "parser_cocci_menhir.mly" +# 866 "parser_cocci_menhir.mly" ( P.ifthenelse _1 _2 _3 _4 _5 _6 _7 ) -# 26754 "parser_cocci_menhir.ml" +# 26755 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26812,37 +26813,37 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _8 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 26816 "parser_cocci_menhir.ml" +# 26817 "parser_cocci_menhir.ml" ) = Obj.magic _8 in let _7 : 'tv_option_eexpr_ = Obj.magic _7 in let _6 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 26822 "parser_cocci_menhir.ml" +# 26823 "parser_cocci_menhir.ml" ) = Obj.magic _6 in let _5 : 'tv_option_eexpr_ = Obj.magic _5 in let _4 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 26828 "parser_cocci_menhir.ml" +# 26829 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_option_eexpr_ = Obj.magic _3 in let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 26834 "parser_cocci_menhir.ml" +# 26835 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 57 "parser_cocci_menhir.mly" (Data.clt) -# 26839 "parser_cocci_menhir.ml" +# 26840 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__9_ in let _v : 'tv_statement = -# 868 "parser_cocci_menhir.mly" +# 869 "parser_cocci_menhir.mly" ( P.forloop _1 _2 _3 _4 _5 _6 _7 _8 _9 ) -# 26846 "parser_cocci_menhir.ml" +# 26847 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26884,25 +26885,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _4 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 26888 "parser_cocci_menhir.ml" +# 26889 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr = Obj.magic _3 in let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 26894 "parser_cocci_menhir.ml" +# 26895 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 57 "parser_cocci_menhir.mly" (Data.clt) -# 26899 "parser_cocci_menhir.ml" +# 26900 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : 'tv_statement = -# 870 "parser_cocci_menhir.mly" +# 871 "parser_cocci_menhir.mly" ( P.whileloop _1 _2 _3 _4 _5 ) -# 26906 "parser_cocci_menhir.ml" +# 26907 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -26953,36 +26954,36 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _7 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 26957 "parser_cocci_menhir.ml" +# 26958 "parser_cocci_menhir.ml" ) = Obj.magic _7 in let _6 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 26962 "parser_cocci_menhir.ml" +# 26963 "parser_cocci_menhir.ml" ) = Obj.magic _6 in let _5 : 'tv_eexpr = Obj.magic _5 in let _4 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 26968 "parser_cocci_menhir.ml" +# 26969 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : ( # 57 "parser_cocci_menhir.mly" (Data.clt) -# 26973 "parser_cocci_menhir.ml" +# 26974 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_single_statement = Obj.magic _2 in let _1 : ( # 57 "parser_cocci_menhir.mly" (Data.clt) -# 26979 "parser_cocci_menhir.ml" +# 26980 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__7_ in let _v : 'tv_statement = -# 872 "parser_cocci_menhir.mly" +# 873 "parser_cocci_menhir.mly" ( P.doloop _1 _2 _3 _4 _5 _6 _7 ) -# 26986 "parser_cocci_menhir.ml" +# 26987 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27024,21 +27025,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _4 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 27028 "parser_cocci_menhir.ml" +# 27029 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr_list_option = Obj.magic _3 in let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 27034 "parser_cocci_menhir.ml" +# 27035 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_iter_ident = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : 'tv_statement = -# 874 "parser_cocci_menhir.mly" +# 875 "parser_cocci_menhir.mly" ( P.iterator _1 _2 _3 _4 _5 ) -# 27042 "parser_cocci_menhir.ml" +# 27043 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27089,36 +27090,36 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _7 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 27093 "parser_cocci_menhir.ml" +# 27094 "parser_cocci_menhir.ml" ) = Obj.magic _7 in let _6 : 'tv_list_case_line_ = Obj.magic _6 in let _5 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 27099 "parser_cocci_menhir.ml" +# 27100 "parser_cocci_menhir.ml" ) = Obj.magic _5 in let _4 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 27104 "parser_cocci_menhir.ml" +# 27105 "parser_cocci_menhir.ml" ) = Obj.magic _4 in let _3 : 'tv_eexpr = Obj.magic _3 in let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 27110 "parser_cocci_menhir.ml" +# 27111 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 57 "parser_cocci_menhir.mly" (Data.clt) -# 27115 "parser_cocci_menhir.ml" +# 27116 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__7_ in let _v : 'tv_statement = -# 876 "parser_cocci_menhir.mly" +# 877 "parser_cocci_menhir.mly" ( P.switch _1 _2 _3 _4 _5 _6 _7 ) -# 27122 "parser_cocci_menhir.ml" +# 27123 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27149,20 +27150,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 27153 "parser_cocci_menhir.ml" +# 27154 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_eexpr = Obj.magic _2 in let _1 : ( # 57 "parser_cocci_menhir.mly" (Data.clt) -# 27159 "parser_cocci_menhir.ml" +# 27160 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_statement = -# 877 "parser_cocci_menhir.mly" +# 878 "parser_cocci_menhir.mly" ( P.ret_exp _1 _2 _3 ) -# 27166 "parser_cocci_menhir.ml" +# 27167 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27188,19 +27189,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 27192 "parser_cocci_menhir.ml" +# 27193 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 57 "parser_cocci_menhir.mly" (Data.clt) -# 27197 "parser_cocci_menhir.ml" +# 27198 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_statement = -# 878 "parser_cocci_menhir.mly" +# 879 "parser_cocci_menhir.mly" ( P.ret _1 _2 ) -# 27204 "parser_cocci_menhir.ml" +# 27205 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27226,19 +27227,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 27230 "parser_cocci_menhir.ml" +# 27231 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 27235 "parser_cocci_menhir.ml" +# 27236 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_statement = -# 879 "parser_cocci_menhir.mly" +# 880 "parser_cocci_menhir.mly" ( P.break _1 _2 ) -# 27242 "parser_cocci_menhir.ml" +# 27243 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27264,19 +27265,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 27268 "parser_cocci_menhir.ml" +# 27269 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 27273 "parser_cocci_menhir.ml" +# 27274 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_statement = -# 880 "parser_cocci_menhir.mly" +# 881 "parser_cocci_menhir.mly" ( P.cont _1 _2 ) -# 27280 "parser_cocci_menhir.ml" +# 27281 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27302,15 +27303,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 27306 "parser_cocci_menhir.ml" +# 27307 "parser_cocci_menhir.ml" ) = Obj.magic _2 in let _1 : 'tv_ident = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_statement = -# 881 "parser_cocci_menhir.mly" +# 882 "parser_cocci_menhir.mly" ( P.label _1 _2 ) -# 27314 "parser_cocci_menhir.ml" +# 27315 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27341,20 +27342,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 27345 "parser_cocci_menhir.ml" +# 27346 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_ident = Obj.magic _2 in let _1 : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 27351 "parser_cocci_menhir.ml" +# 27352 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_statement = -# 882 "parser_cocci_menhir.mly" +# 883 "parser_cocci_menhir.mly" ( P.goto _1 _2 _3 ) -# 27358 "parser_cocci_menhir.ml" +# 27359 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27385,20 +27386,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 27389 "parser_cocci_menhir.ml" +# 27390 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_fun_start = Obj.magic _2 in let _1 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 27395 "parser_cocci_menhir.ml" +# 27396 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_statement = -# 884 "parser_cocci_menhir.mly" +# 885 "parser_cocci_menhir.mly" ( P.seq _1 _2 _3 ) -# 27402 "parser_cocci_menhir.ml" +# 27403 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27425,14 +27426,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 27429 "parser_cocci_menhir.ml" +# 27430 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos_w_ in let _v : 'tv_stm_dots = -# 888 "parser_cocci_menhir.mly" +# 889 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Dots(P.clt2mcode "..." _1, List.concat w)) ) -# 27436 "parser_cocci_menhir.ml" +# 27437 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27468,22 +27469,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let c : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 27472 "parser_cocci_menhir.ml" +# 27473 "parser_cocci_menhir.ml" ) = Obj.magic c in let b : 'tv_nest_start = Obj.magic b in let w : 'tv_list_whenppdecs_ = Obj.magic w in let _1 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 27479 "parser_cocci_menhir.ml" +# 27480 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos_c_ in let _v : 'tv_stm_dots = -# 890 "parser_cocci_menhir.mly" +# 891 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<..." _1, b, P.clt2mcode "...>" c, List.concat w, false)) ) -# 27487 "parser_cocci_menhir.ml" +# 27488 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27519,22 +27520,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let c : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 27523 "parser_cocci_menhir.ml" +# 27524 "parser_cocci_menhir.ml" ) = Obj.magic c in let b : 'tv_nest_start = Obj.magic b in let w : 'tv_list_whenppdecs_ = Obj.magic w in let _1 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 27530 "parser_cocci_menhir.ml" +# 27531 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos_c_ in let _v : 'tv_stm_dots = -# 893 "parser_cocci_menhir.mly" +# 894 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<+..." _1, b, P.clt2mcode "...+>" c, List.concat w, true)) ) -# 27538 "parser_cocci_menhir.ml" +# 27539 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27555,14 +27556,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let s : ( # 53 "parser_cocci_menhir.mly" (Data.clt) -# 27559 "parser_cocci_menhir.ml" +# 27560 "parser_cocci_menhir.ml" ) = Obj.magic s in let _startpos = _startpos_s_ in let _endpos = _endpos_s_ in let _v : 'tv_storage = -# 815 "parser_cocci_menhir.mly" +# 816 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.Static s ) -# 27566 "parser_cocci_menhir.ml" +# 27567 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27583,14 +27584,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let s : ( # 53 "parser_cocci_menhir.mly" (Data.clt) -# 27587 "parser_cocci_menhir.ml" +# 27588 "parser_cocci_menhir.ml" ) = Obj.magic s in let _startpos = _startpos_s_ in let _endpos = _endpos_s_ in let _v : 'tv_storage = -# 816 "parser_cocci_menhir.mly" +# 817 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.Auto s ) -# 27594 "parser_cocci_menhir.ml" +# 27595 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27611,14 +27612,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let s : ( # 53 "parser_cocci_menhir.mly" (Data.clt) -# 27615 "parser_cocci_menhir.ml" +# 27616 "parser_cocci_menhir.ml" ) = Obj.magic s in let _startpos = _startpos_s_ in let _endpos = _endpos_s_ in let _v : 'tv_storage = -# 817 "parser_cocci_menhir.mly" +# 818 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.Register s ) -# 27622 "parser_cocci_menhir.ml" +# 27623 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27639,14 +27640,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let s : ( # 53 "parser_cocci_menhir.mly" (Data.clt) -# 27643 "parser_cocci_menhir.ml" +# 27644 "parser_cocci_menhir.ml" ) = Obj.magic s in let _startpos = _startpos_s_ in let _endpos = _endpos_s_ in let _v : 'tv_storage = -# 818 "parser_cocci_menhir.mly" +# 819 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.Extern s ) -# 27650 "parser_cocci_menhir.ml" +# 27651 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27668,7 +27669,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_struct_decl = # 521 "parser_cocci_menhir.mly" ( [] ) -# 27672 "parser_cocci_menhir.ml" +# 27673 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27699,7 +27700,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 27703 "parser_cocci_menhir.ml" +# 27704 "parser_cocci_menhir.ml" ) = Obj.magic pv in let d : 'tv_d_ident = Obj.magic d in let t : 'tv_ctype = Obj.magic t in @@ -27709,7 +27710,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 523 "parser_cocci_menhir.mly" ( let (id,fn) = d in [Ast0.wrap(Ast0.UnInit(None,fn t,id,P.clt2mcode ";" pv))] ) -# 27713 "parser_cocci_menhir.ml" +# 27714 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27770,34 +27771,34 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 27774 "parser_cocci_menhir.ml" +# 27775 "parser_cocci_menhir.ml" ) = Obj.magic pv in let rp2 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 27779 "parser_cocci_menhir.ml" +# 27780 "parser_cocci_menhir.ml" ) = Obj.magic rp2 in let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in let lp2 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 27785 "parser_cocci_menhir.ml" +# 27786 "parser_cocci_menhir.ml" ) = Obj.magic lp2 in let rp1 : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 27790 "parser_cocci_menhir.ml" +# 27791 "parser_cocci_menhir.ml" ) = Obj.magic rp1 in let d : 'tv_d_ident = Obj.magic d in let st : ( # 99 "parser_cocci_menhir.mly" (Data.clt) -# 27796 "parser_cocci_menhir.ml" +# 27797 "parser_cocci_menhir.ml" ) = Obj.magic st in let lp1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 27801 "parser_cocci_menhir.ml" +# 27802 "parser_cocci_menhir.ml" ) = Obj.magic lp1 in let t : 'tv_fn_ctype = Obj.magic t in let _startpos = _startpos_t_ in @@ -27811,7 +27812,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1, P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in [Ast0.wrap(Ast0.UnInit(None,fn t,id,P.clt2mcode ";" pv))] ) -# 27815 "parser_cocci_menhir.ml" +# 27816 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27842,7 +27843,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 27846 "parser_cocci_menhir.ml" +# 27847 "parser_cocci_menhir.ml" ) = Obj.magic pv in let d : 'tv_d_ident = Obj.magic d in let i : 'tv_pure_ident = Obj.magic i in @@ -27852,7 +27853,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 39 "standard.mly" ( None ) -# 27856 "parser_cocci_menhir.ml" +# 27857 "parser_cocci_menhir.ml" in @@ -27860,7 +27861,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( let (id,fn) = d in let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in [Ast0.wrap(Ast0.UnInit(None,fn idtype,id,P.clt2mcode ";" pv))] ) -# 27864 "parser_cocci_menhir.ml" +# 27865 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27896,7 +27897,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let pv : ( # 107 "parser_cocci_menhir.mly" (Data.clt) -# 27900 "parser_cocci_menhir.ml" +# 27901 "parser_cocci_menhir.ml" ) = Obj.magic pv in let d : 'tv_d_ident = Obj.magic d in let i : 'tv_pure_ident = Obj.magic i in @@ -27908,7 +27909,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct # 41 "standard.mly" ( Some x ) -# 27912 "parser_cocci_menhir.ml" +# 27913 "parser_cocci_menhir.ml" in @@ -27916,7 +27917,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct ( let (id,fn) = d in let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in [Ast0.wrap(Ast0.UnInit(None,fn idtype,id,P.clt2mcode ";" pv))] ) -# 27920 "parser_cocci_menhir.ml" +# 27921 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27940,7 +27941,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_struct_decl_list = # 540 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DOTS(_1)) ) -# 27944 "parser_cocci_menhir.ml" +# 27945 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27964,7 +27965,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_struct_decl_list_start = # 543 "parser_cocci_menhir.mly" ( _1 ) -# 27968 "parser_cocci_menhir.ml" +# 27969 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -27994,7 +27995,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_struct_decl_list_start = # 544 "parser_cocci_menhir.mly" ( _1@_2 ) -# 27998 "parser_cocci_menhir.ml" +# 27999 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28024,7 +28025,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _v : 'tv_struct_decl_list_start = # 546 "parser_cocci_menhir.mly" ( (P.mkddots "..." d)::r ) -# 28028 "parser_cocci_menhir.ml" +# 28029 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28045,14 +28046,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let s : ( # 50 "parser_cocci_menhir.mly" (Data.clt) -# 28049 "parser_cocci_menhir.ml" +# 28050 "parser_cocci_menhir.ml" ) = Obj.magic s in let _startpos = _startpos_s_ in let _endpos = _endpos_s_ in let _v : 'tv_struct_or_union = # 517 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.Struct s ) -# 28056 "parser_cocci_menhir.ml" +# 28057 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28073,14 +28074,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let u : ( # 50 "parser_cocci_menhir.mly" (Data.clt) -# 28077 "parser_cocci_menhir.ml" +# 28078 "parser_cocci_menhir.ml" ) = Obj.magic u in let _startpos = _startpos_u_ in let _endpos = _endpos_u_ in let _v : 'tv_struct_or_union = # 518 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.Union u ) -# 28084 "parser_cocci_menhir.ml" +# 28085 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28102,9 +28103,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_top_eexpr = -# 1209 "parser_cocci_menhir.mly" +# 1210 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Exp(_1)))) ) -# 28108 "parser_cocci_menhir.ml" +# 28109 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28135,20 +28136,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _3 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 28139 "parser_cocci_menhir.ml" +# 28140 "parser_cocci_menhir.ml" ) = Obj.magic _3 in let _2 : 'tv_initialize_list = Obj.magic _2 in let _1 : ( # 101 "parser_cocci_menhir.mly" (Data.clt) -# 28145 "parser_cocci_menhir.ml" +# 28146 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : 'tv_top_init = -# 1651 "parser_cocci_menhir.mly" +# 1652 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.InitList(P.clt2mcode "{" _1,_2,P.clt2mcode "}" _3)) ) -# 28152 "parser_cocci_menhir.ml" +# 28153 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28163,9 +28164,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_toplevel_after_dots = -# 1639 "parser_cocci_menhir.mly" +# 1640 "parser_cocci_menhir.mly" ([]) -# 28169 "parser_cocci_menhir.ml" +# 28170 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28191,9 +28192,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_after_dots = -# 1640 "parser_cocci_menhir.mly" +# 1641 "parser_cocci_menhir.mly" (_2) -# 28197 "parser_cocci_menhir.ml" +# 28198 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28221,9 +28222,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_after_dots = -# 1641 "parser_cocci_menhir.mly" +# 1642 "parser_cocci_menhir.mly" ((Ast0.wrap(Ast0.Exp(_1)))::_2) -# 28227 "parser_cocci_menhir.ml" +# 28228 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28251,9 +28252,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_after_dots = -# 1642 "parser_cocci_menhir.mly" +# 1643 "parser_cocci_menhir.mly" (_1@_2) -# 28257 "parser_cocci_menhir.ml" +# 28258 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28279,9 +28280,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_after_dots_init = -# 1630 "parser_cocci_menhir.mly" +# 1631 "parser_cocci_menhir.mly" (_2) -# 28285 "parser_cocci_menhir.ml" +# 28286 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28309,9 +28310,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_after_dots_init = -# 1631 "parser_cocci_menhir.mly" +# 1632 "parser_cocci_menhir.mly" ((Ast0.wrap(Ast0.Exp(_1)))::_2) -# 28315 "parser_cocci_menhir.ml" +# 28316 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28339,9 +28340,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_after_dots_init = -# 1632 "parser_cocci_menhir.mly" +# 1633 "parser_cocci_menhir.mly" (_1@_2) -# 28345 "parser_cocci_menhir.ml" +# 28346 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28356,9 +28357,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_toplevel_after_exp = -# 1635 "parser_cocci_menhir.mly" +# 1636 "parser_cocci_menhir.mly" ([]) -# 28362 "parser_cocci_menhir.ml" +# 28363 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28386,9 +28387,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_after_exp = -# 1636 "parser_cocci_menhir.mly" +# 1637 "parser_cocci_menhir.mly" (_1::_2) -# 28392 "parser_cocci_menhir.ml" +# 28393 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28403,9 +28404,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in let _endpos = _startpos in let _v : 'tv_toplevel_after_stm = -# 1645 "parser_cocci_menhir.mly" +# 1646 "parser_cocci_menhir.mly" ([]) -# 28409 "parser_cocci_menhir.ml" +# 28410 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28433,9 +28434,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_after_stm = -# 1646 "parser_cocci_menhir.mly" +# 1647 "parser_cocci_menhir.mly" (_1::_2) -# 28439 "parser_cocci_menhir.ml" +# 28440 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28463,9 +28464,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_after_stm = -# 1647 "parser_cocci_menhir.mly" +# 1648 "parser_cocci_menhir.mly" (_1@_2) -# 28469 "parser_cocci_menhir.ml" +# 28470 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28493,9 +28494,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_seq_start_toplevel_after_dots_ = -# 1625 "parser_cocci_menhir.mly" +# 1626 "parser_cocci_menhir.mly" ( _1::_2 ) -# 28499 "parser_cocci_menhir.ml" +# 28500 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28523,9 +28524,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_seq_start_toplevel_after_dots_ = -# 1626 "parser_cocci_menhir.mly" +# 1627 "parser_cocci_menhir.mly" ( (Ast0.wrap(Ast0.Exp(_1)))::_2 ) -# 28529 "parser_cocci_menhir.ml" +# 28530 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28553,9 +28554,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_seq_start_toplevel_after_dots_ = -# 1627 "parser_cocci_menhir.mly" +# 1628 "parser_cocci_menhir.mly" ( _1@_2 ) -# 28559 "parser_cocci_menhir.ml" +# 28560 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28588,7 +28589,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let a0 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 28592 "parser_cocci_menhir.ml" +# 28593 "parser_cocci_menhir.ml" ) = Obj.magic a0 in let _startpos = _startpos_a0_ in let _endpos = _endpos_b_ in @@ -28596,15 +28597,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let w = w0 in let a = a0 in -# 898 "parser_cocci_menhir.mly" +# 899 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Dots(P.clt2mcode "..." a, List.concat w)) ) -# 28602 "parser_cocci_menhir.ml" +# 28603 "parser_cocci_menhir.ml" in -# 1618 "parser_cocci_menhir.mly" +# 1619 "parser_cocci_menhir.mly" ( a::b ) -# 28608 "parser_cocci_menhir.ml" +# 28609 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28646,14 +28647,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let c0 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 28650 "parser_cocci_menhir.ml" +# 28651 "parser_cocci_menhir.ml" ) = Obj.magic c0 in let b0 : 'tv_nest_start = Obj.magic b0 in let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in let a0 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 28657 "parser_cocci_menhir.ml" +# 28658 "parser_cocci_menhir.ml" ) = Obj.magic a0 in let _startpos = _startpos_a0_ in let _endpos = _endpos_b_ in @@ -28663,16 +28664,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let w = w0 in let a = a0 in -# 902 "parser_cocci_menhir.mly" +# 903 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<..." a, b, P.clt2mcode "...>" c, List.concat w, false)) ) -# 28670 "parser_cocci_menhir.ml" +# 28671 "parser_cocci_menhir.ml" in -# 1619 "parser_cocci_menhir.mly" +# 1620 "parser_cocci_menhir.mly" ( a::b ) -# 28676 "parser_cocci_menhir.ml" +# 28677 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28714,14 +28715,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let c0 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 28718 "parser_cocci_menhir.ml" +# 28719 "parser_cocci_menhir.ml" ) = Obj.magic c0 in let b0 : 'tv_nest_start = Obj.magic b0 in let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in let a0 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 28725 "parser_cocci_menhir.ml" +# 28726 "parser_cocci_menhir.ml" ) = Obj.magic a0 in let _startpos = _startpos_a0_ in let _endpos = _endpos_b_ in @@ -28731,16 +28732,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let w = w0 in let a = a0 in -# 905 "parser_cocci_menhir.mly" +# 906 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<+..." a, b, P.clt2mcode "...+>" c, List.concat w, true)) ) -# 28738 "parser_cocci_menhir.ml" +# 28739 "parser_cocci_menhir.ml" in -# 1619 "parser_cocci_menhir.mly" +# 1620 "parser_cocci_menhir.mly" ( a::b ) -# 28744 "parser_cocci_menhir.ml" +# 28745 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28776,14 +28777,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let c0 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 28780 "parser_cocci_menhir.ml" +# 28781 "parser_cocci_menhir.ml" ) = Obj.magic c0 in let b0 : 'tv_nest_start = Obj.magic b0 in let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in let a0 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 28787 "parser_cocci_menhir.ml" +# 28788 "parser_cocci_menhir.ml" ) = Obj.magic a0 in let _startpos = _startpos_a0_ in let _endpos = _endpos_c0_ in @@ -28793,16 +28794,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let w = w0 in let a = a0 in -# 902 "parser_cocci_menhir.mly" +# 903 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<..." a, b, P.clt2mcode "...>" c, List.concat w, false)) ) -# 28800 "parser_cocci_menhir.ml" +# 28801 "parser_cocci_menhir.ml" in -# 1620 "parser_cocci_menhir.mly" +# 1621 "parser_cocci_menhir.mly" ( [a] ) -# 28806 "parser_cocci_menhir.ml" +# 28807 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28838,14 +28839,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let c0 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 28842 "parser_cocci_menhir.ml" +# 28843 "parser_cocci_menhir.ml" ) = Obj.magic c0 in let b0 : 'tv_nest_start = Obj.magic b0 in let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in let a0 : ( # 73 "parser_cocci_menhir.mly" (Data.clt) -# 28849 "parser_cocci_menhir.ml" +# 28850 "parser_cocci_menhir.ml" ) = Obj.magic a0 in let _startpos = _startpos_a0_ in let _endpos = _endpos_c0_ in @@ -28855,16 +28856,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let w = w0 in let a = a0 in -# 905 "parser_cocci_menhir.mly" +# 906 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<+..." a, b, P.clt2mcode "...+>" c, List.concat w, true)) ) -# 28862 "parser_cocci_menhir.ml" +# 28863 "parser_cocci_menhir.ml" in -# 1620 "parser_cocci_menhir.mly" +# 1621 "parser_cocci_menhir.mly" ( [a] ) -# 28868 "parser_cocci_menhir.ml" +# 28869 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28892,9 +28893,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_seq_startne_toplevel_after_dots_init_ = -# 1621 "parser_cocci_menhir.mly" +# 1622 "parser_cocci_menhir.mly" ( (Ast0.wrap(Ast0.Exp(_1)))::_2 ) -# 28898 "parser_cocci_menhir.ml" +# 28899 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28922,9 +28923,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_toplevel_seq_startne_toplevel_after_dots_init_ = -# 1622 "parser_cocci_menhir.mly" +# 1623 "parser_cocci_menhir.mly" ( _1@_2 ) -# 28928 "parser_cocci_menhir.ml" +# 28929 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28946,9 +28947,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_typedef_ident = -# 1530 "parser_cocci_menhir.mly" +# 1531 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.TypeName(P.id2mcode _1)) ) -# 28952 "parser_cocci_menhir.ml" +# 28953 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28969,15 +28970,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 64 "parser_cocci_menhir.mly" (Parse_aux.info) -# 28973 "parser_cocci_menhir.ml" +# 28974 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_typedef_ident = -# 1532 "parser_cocci_menhir.mly" +# 1533 "parser_cocci_menhir.mly" ( let (nm,pure,clt) = _1 in Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) ) -# 28981 "parser_cocci_menhir.ml" +# 28982 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -28999,9 +29000,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_unary_expr_eexpr_dot_expressions_ = -# 1298 "parser_cocci_menhir.mly" +# 1299 "parser_cocci_menhir.mly" ( _1 ) -# 29005 "parser_cocci_menhir.ml" +# 29006 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29028,14 +29029,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 29032 "parser_cocci_menhir.ml" +# 29033 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_dot_expressions_ = -# 1300 "parser_cocci_menhir.mly" +# 1301 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) ) -# 29039 "parser_cocci_menhir.ml" +# 29040 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29062,14 +29063,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 29066 "parser_cocci_menhir.ml" +# 29067 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_dot_expressions_ = -# 1302 "parser_cocci_menhir.mly" +# 1303 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) ) -# 29073 "parser_cocci_menhir.ml" +# 29074 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29097,9 +29098,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_dot_expressions_ = -# 1304 "parser_cocci_menhir.mly" +# 1305 "parser_cocci_menhir.mly" ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) ) -# 29103 "parser_cocci_menhir.ml" +# 29104 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29126,15 +29127,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 29130 "parser_cocci_menhir.ml" +# 29131 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_dot_expressions_ = -# 1306 "parser_cocci_menhir.mly" +# 1307 "parser_cocci_menhir.mly" ( let mcode = P.clt2mcode Ast.Not _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) ) -# 29138 "parser_cocci_menhir.ml" +# 29139 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29161,14 +29162,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 29165 "parser_cocci_menhir.ml" +# 29166 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_dot_expressions_ = -# 1309 "parser_cocci_menhir.mly" +# 1310 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) ) -# 29172 "parser_cocci_menhir.ml" +# 29173 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29204,27 +29205,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let rp : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 29208 "parser_cocci_menhir.ml" +# 29209 "parser_cocci_menhir.ml" ) = Obj.magic rp in let t : 'tv_ctype = Obj.magic t in let lp : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 29214 "parser_cocci_menhir.ml" +# 29215 "parser_cocci_menhir.ml" ) = Obj.magic lp in let s : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 29219 "parser_cocci_menhir.ml" +# 29220 "parser_cocci_menhir.ml" ) = Obj.magic s in let _startpos = _startpos_s_ in let _endpos = _endpos_rp_ in let _v : 'tv_unary_expr_eexpr_dot_expressions_ = -# 1311 "parser_cocci_menhir.mly" +# 1312 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s, P.clt2mcode "(" lp,t, P.clt2mcode ")" rp)) ) -# 29228 "parser_cocci_menhir.ml" +# 29229 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29246,9 +29247,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_unary_expr_eexpr_invalid_ = -# 1298 "parser_cocci_menhir.mly" +# 1299 "parser_cocci_menhir.mly" ( _1 ) -# 29252 "parser_cocci_menhir.ml" +# 29253 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29275,14 +29276,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 29279 "parser_cocci_menhir.ml" +# 29280 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_invalid_ = -# 1300 "parser_cocci_menhir.mly" +# 1301 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) ) -# 29286 "parser_cocci_menhir.ml" +# 29287 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29309,14 +29310,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 29313 "parser_cocci_menhir.ml" +# 29314 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_invalid_ = -# 1302 "parser_cocci_menhir.mly" +# 1303 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) ) -# 29320 "parser_cocci_menhir.ml" +# 29321 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29344,9 +29345,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_invalid_ = -# 1304 "parser_cocci_menhir.mly" +# 1305 "parser_cocci_menhir.mly" ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) ) -# 29350 "parser_cocci_menhir.ml" +# 29351 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29373,15 +29374,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 29377 "parser_cocci_menhir.ml" +# 29378 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_invalid_ = -# 1306 "parser_cocci_menhir.mly" +# 1307 "parser_cocci_menhir.mly" ( let mcode = P.clt2mcode Ast.Not _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) ) -# 29385 "parser_cocci_menhir.ml" +# 29386 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29408,14 +29409,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 29412 "parser_cocci_menhir.ml" +# 29413 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_invalid_ = -# 1309 "parser_cocci_menhir.mly" +# 1310 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) ) -# 29419 "parser_cocci_menhir.ml" +# 29420 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29451,27 +29452,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let rp : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 29455 "parser_cocci_menhir.ml" +# 29456 "parser_cocci_menhir.ml" ) = Obj.magic rp in let t : 'tv_ctype = Obj.magic t in let lp : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 29461 "parser_cocci_menhir.ml" +# 29462 "parser_cocci_menhir.ml" ) = Obj.magic lp in let s : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 29466 "parser_cocci_menhir.ml" +# 29467 "parser_cocci_menhir.ml" ) = Obj.magic s in let _startpos = _startpos_s_ in let _endpos = _endpos_rp_ in let _v : 'tv_unary_expr_eexpr_invalid_ = -# 1311 "parser_cocci_menhir.mly" +# 1312 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s, P.clt2mcode "(" lp,t, P.clt2mcode ")" rp)) ) -# 29475 "parser_cocci_menhir.ml" +# 29476 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29493,9 +29494,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_unary_expr_eexpr_nest_expressions_ = -# 1298 "parser_cocci_menhir.mly" +# 1299 "parser_cocci_menhir.mly" ( _1 ) -# 29499 "parser_cocci_menhir.ml" +# 29500 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29522,14 +29523,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 29526 "parser_cocci_menhir.ml" +# 29527 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_nest_expressions_ = -# 1300 "parser_cocci_menhir.mly" +# 1301 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) ) -# 29533 "parser_cocci_menhir.ml" +# 29534 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29556,14 +29557,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 29560 "parser_cocci_menhir.ml" +# 29561 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_nest_expressions_ = -# 1302 "parser_cocci_menhir.mly" +# 1303 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) ) -# 29567 "parser_cocci_menhir.ml" +# 29568 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29591,9 +29592,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_nest_expressions_ = -# 1304 "parser_cocci_menhir.mly" +# 1305 "parser_cocci_menhir.mly" ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) ) -# 29597 "parser_cocci_menhir.ml" +# 29598 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29620,15 +29621,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 29624 "parser_cocci_menhir.ml" +# 29625 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_nest_expressions_ = -# 1306 "parser_cocci_menhir.mly" +# 1307 "parser_cocci_menhir.mly" ( let mcode = P.clt2mcode Ast.Not _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) ) -# 29632 "parser_cocci_menhir.ml" +# 29633 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29655,14 +29656,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 29659 "parser_cocci_menhir.ml" +# 29660 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_eexpr_nest_expressions_ = -# 1309 "parser_cocci_menhir.mly" +# 1310 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) ) -# 29666 "parser_cocci_menhir.ml" +# 29667 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29698,27 +29699,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let rp : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 29702 "parser_cocci_menhir.ml" +# 29703 "parser_cocci_menhir.ml" ) = Obj.magic rp in let t : 'tv_ctype = Obj.magic t in let lp : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 29708 "parser_cocci_menhir.ml" +# 29709 "parser_cocci_menhir.ml" ) = Obj.magic lp in let s : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 29713 "parser_cocci_menhir.ml" +# 29714 "parser_cocci_menhir.ml" ) = Obj.magic s in let _startpos = _startpos_s_ in let _endpos = _endpos_rp_ in let _v : 'tv_unary_expr_eexpr_nest_expressions_ = -# 1311 "parser_cocci_menhir.mly" +# 1312 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s, P.clt2mcode "(" lp,t, P.clt2mcode ")" rp)) ) -# 29722 "parser_cocci_menhir.ml" +# 29723 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29740,9 +29741,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_unary_expr_expr_invalid_ = -# 1298 "parser_cocci_menhir.mly" +# 1299 "parser_cocci_menhir.mly" ( _1 ) -# 29746 "parser_cocci_menhir.ml" +# 29747 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29769,14 +29770,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 29773 "parser_cocci_menhir.ml" +# 29774 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_expr_invalid_ = -# 1300 "parser_cocci_menhir.mly" +# 1301 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) ) -# 29780 "parser_cocci_menhir.ml" +# 29781 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29803,14 +29804,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 85 "parser_cocci_menhir.mly" (Data.clt) -# 29807 "parser_cocci_menhir.ml" +# 29808 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_expr_invalid_ = -# 1302 "parser_cocci_menhir.mly" +# 1303 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) ) -# 29814 "parser_cocci_menhir.ml" +# 29815 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29838,9 +29839,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_expr_invalid_ = -# 1304 "parser_cocci_menhir.mly" +# 1305 "parser_cocci_menhir.mly" ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) ) -# 29844 "parser_cocci_menhir.ml" +# 29845 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29867,15 +29868,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 29871 "parser_cocci_menhir.ml" +# 29872 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_expr_invalid_ = -# 1306 "parser_cocci_menhir.mly" +# 1307 "parser_cocci_menhir.mly" ( let mcode = P.clt2mcode Ast.Not _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) ) -# 29879 "parser_cocci_menhir.ml" +# 29880 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29902,14 +29903,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 29906 "parser_cocci_menhir.ml" +# 29907 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_unary_expr_expr_invalid_ = -# 1309 "parser_cocci_menhir.mly" +# 1310 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) ) -# 29913 "parser_cocci_menhir.ml" +# 29914 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29945,27 +29946,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let rp : ( # 77 "parser_cocci_menhir.mly" (Data.clt) -# 29949 "parser_cocci_menhir.ml" +# 29950 "parser_cocci_menhir.ml" ) = Obj.magic rp in let t : 'tv_ctype = Obj.magic t in let lp : ( # 76 "parser_cocci_menhir.mly" (Data.clt) -# 29955 "parser_cocci_menhir.ml" +# 29956 "parser_cocci_menhir.ml" ) = Obj.magic lp in let s : ( # 58 "parser_cocci_menhir.mly" (Data.clt) -# 29960 "parser_cocci_menhir.ml" +# 29961 "parser_cocci_menhir.ml" ) = Obj.magic s in let _startpos = _startpos_s_ in let _endpos = _endpos_rp_ in let _v : 'tv_unary_expr_expr_invalid_ = -# 1311 "parser_cocci_menhir.mly" +# 1312 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s, P.clt2mcode "(" lp,t, P.clt2mcode ")" rp)) ) -# 29969 "parser_cocci_menhir.ml" +# 29970 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -29986,14 +29987,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 93 "parser_cocci_menhir.mly" (Data.clt) -# 29990 "parser_cocci_menhir.ml" +# 29991 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_unary_op = -# 1315 "parser_cocci_menhir.mly" +# 1316 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.GetRef _1 ) -# 29997 "parser_cocci_menhir.ml" +# 29998 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30014,14 +30015,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 99 "parser_cocci_menhir.mly" (Data.clt) -# 30018 "parser_cocci_menhir.ml" +# 30019 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_unary_op = -# 1316 "parser_cocci_menhir.mly" +# 1317 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.DeRef _1 ) -# 30025 "parser_cocci_menhir.ml" +# 30026 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30042,14 +30043,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 98 "parser_cocci_menhir.mly" (Data.clt) -# 30046 "parser_cocci_menhir.ml" +# 30047 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_unary_op = -# 1317 "parser_cocci_menhir.mly" +# 1318 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.UnPlus _1 ) -# 30053 "parser_cocci_menhir.ml" +# 30054 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30070,14 +30071,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 98 "parser_cocci_menhir.mly" (Data.clt) -# 30074 "parser_cocci_menhir.ml" +# 30075 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_unary_op = -# 1318 "parser_cocci_menhir.mly" +# 1319 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.UnMinus _1 ) -# 30081 "parser_cocci_menhir.ml" +# 30082 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30098,14 +30099,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _1 : ( # 99 "parser_cocci_menhir.mly" (Data.clt) -# 30102 "parser_cocci_menhir.ml" +# 30103 "parser_cocci_menhir.ml" ) = Obj.magic _1 in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : 'tv_unary_op = -# 1319 "parser_cocci_menhir.mly" +# 1320 "parser_cocci_menhir.mly" ( P.clt2mcode Ast.Tilde _1 ) -# 30109 "parser_cocci_menhir.ml" +# 30110 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30133,9 +30134,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_when_start = -# 1744 "parser_cocci_menhir.mly" +# 1745 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DOTS((Ast0.wrap(Ast0.Exp(_1)))::_2)) ) -# 30139 "parser_cocci_menhir.ml" +# 30140 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30163,9 +30164,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : 'tv_when_start = -# 1746 "parser_cocci_menhir.mly" +# 1747 "parser_cocci_menhir.mly" ( Ast0.wrap(Ast0.DOTS(_1@_2)) ) -# 30169 "parser_cocci_menhir.ml" +# 30170 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30183,13 +30184,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct MenhirLib.EngineTypes.endp = _endpos_w_; MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in - let w : 'tv_whens_when_start_rule_elem_statement_ = Obj.magic w in + let w : 'tv_whens_when_start_rule_elem_statement_any_strict_ = Obj.magic w in let _startpos = _startpos_w_ in let _endpos = _endpos_w_ in let _v : 'tv_whenppdecs = -# 909 "parser_cocci_menhir.mly" +# 910 "parser_cocci_menhir.mly" ( w ) -# 30193 "parser_cocci_menhir.ml" +# 30194 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30222,10 +30223,10 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let w : 'tv_when_start = Obj.magic w in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in - let _v : 'tv_whens_when_start_rule_elem_statement_ = -# 1812 "parser_cocci_menhir.mly" + let _v : 'tv_whens_when_start_rule_elem_statement_any_strict_ = +# 1813 "parser_cocci_menhir.mly" ( [Ast0.WhenNot w] ) -# 30229 "parser_cocci_menhir.ml" +# 30230 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30258,10 +30259,10 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let w : 'tv_rule_elem_statement = Obj.magic w in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in - let _v : 'tv_whens_when_start_rule_elem_statement_ = -# 1813 "parser_cocci_menhir.mly" + let _v : 'tv_whens_when_start_rule_elem_statement_any_strict_ = +# 1814 "parser_cocci_menhir.mly" ( [Ast0.WhenAlways w] ) -# 30265 "parser_cocci_menhir.ml" +# 30266 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30290,10 +30291,10 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let _2 : 'tv_comma_list_any_strict_ = Obj.magic _2 in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in - let _v : 'tv_whens_when_start_rule_elem_statement_ = -# 1815 "parser_cocci_menhir.mly" + let _v : 'tv_whens_when_start_rule_elem_statement_any_strict_ = +# 1816 "parser_cocci_menhir.mly" ( List.map (function x -> Ast0.WhenModifier(x)) _2 ) -# 30297 "parser_cocci_menhir.ml" +# 30298 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30326,10 +30327,10 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let e : 'tv_eexpr = Obj.magic e in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in - let _v : 'tv_whens_when_start_rule_elem_statement_ = -# 1816 "parser_cocci_menhir.mly" + let _v : 'tv_whens_when_start_rule_elem_statement_any_strict_ = +# 1817 "parser_cocci_menhir.mly" ( [Ast0.WhenNotTrue e] ) -# 30333 "parser_cocci_menhir.ml" +# 30334 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30362,10 +30363,10 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct let e : 'tv_eexpr = Obj.magic e in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in - let _v : 'tv_whens_when_start_rule_elem_statement_ = -# 1817 "parser_cocci_menhir.mly" + let _v : 'tv_whens_when_start_rule_elem_statement_any_strict_ = +# 1818 "parser_cocci_menhir.mly" ( [Ast0.WhenNotFalse e] ) -# 30369 "parser_cocci_menhir.ml" +# 30370 "parser_cocci_menhir.ml" in _menhir_env.MenhirLib.EngineTypes.stack <- { MenhirLib.EngineTypes.state = _menhir_s; @@ -30389,7 +30390,7 @@ let rec script_meta_main = (Obj.magic (MenhirInterpreter.entry 1549 lexer lexbuf) : ( # 159 "parser_cocci_menhir.mly" (string * (string * string)) -# 30393 "parser_cocci_menhir.ml" +# 30394 "parser_cocci_menhir.ml" )) and rule_name = @@ -30397,7 +30398,7 @@ and rule_name = (Obj.magic (MenhirInterpreter.entry 1477 lexer lexbuf) : ( # 153 "parser_cocci_menhir.mly" (Ast_cocci.rulename) -# 30401 "parser_cocci_menhir.ml" +# 30402 "parser_cocci_menhir.ml" )) and reinit = @@ -30405,7 +30406,7 @@ and reinit = (Obj.magic (MenhirInterpreter.entry 1475 lexer lexbuf) : ( # 131 "parser_cocci_menhir.mly" (unit) -# 30409 "parser_cocci_menhir.ml" +# 30410 "parser_cocci_menhir.ml" )) and plus_main = @@ -30413,7 +30414,7 @@ and plus_main = (Obj.magic (MenhirInterpreter.entry 1439 lexer lexbuf) : ( # 140 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 30417 "parser_cocci_menhir.ml" +# 30418 "parser_cocci_menhir.ml" )) and plus_exp_main = @@ -30421,7 +30422,7 @@ and plus_exp_main = (Obj.magic (MenhirInterpreter.entry 1430 lexer lexbuf) : ( # 143 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 30425 "parser_cocci_menhir.ml" +# 30426 "parser_cocci_menhir.ml" )) and never_used = @@ -30429,7 +30430,7 @@ and never_used = (Obj.magic (MenhirInterpreter.entry 1424 lexer lexbuf) : ( # 168 "parser_cocci_menhir.mly" (unit) -# 30433 "parser_cocci_menhir.ml" +# 30434 "parser_cocci_menhir.ml" )) and minus_main = @@ -30437,7 +30438,7 @@ and minus_main = (Obj.magic (MenhirInterpreter.entry 1338 lexer lexbuf) : ( # 134 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 30441 "parser_cocci_menhir.ml" +# 30442 "parser_cocci_menhir.ml" )) and minus_exp_main = @@ -30445,7 +30446,7 @@ and minus_exp_main = (Obj.magic (MenhirInterpreter.entry 1314 lexer lexbuf) : ( # 137 "parser_cocci_menhir.mly" (Ast0_cocci.rule) -# 30449 "parser_cocci_menhir.ml" +# 30450 "parser_cocci_menhir.ml" )) and meta_main = @@ -30453,7 +30454,7 @@ and meta_main = (Obj.magic (MenhirInterpreter.entry 1311 lexer lexbuf) : ( # 157 "parser_cocci_menhir.mly" ((Ast_cocci.metavar,Ast_cocci.metavar) Common.either list) -# 30457 "parser_cocci_menhir.ml" +# 30458 "parser_cocci_menhir.ml" )) and iso_rule_name = @@ -30461,7 +30462,7 @@ and iso_rule_name = (Obj.magic (MenhirInterpreter.entry 1307 lexer lexbuf) : ( # 149 "parser_cocci_menhir.mly" (Ast_cocci.rulename) -# 30465 "parser_cocci_menhir.ml" +# 30466 "parser_cocci_menhir.ml" )) and iso_meta_main = @@ -30469,7 +30470,7 @@ and iso_meta_main = (Obj.magic (MenhirInterpreter.entry 1104 lexer lexbuf) : ( # 165 "parser_cocci_menhir.mly" ((Ast_cocci.metavar,Ast_cocci.metavar) Common.either list) -# 30473 "parser_cocci_menhir.ml" +# 30474 "parser_cocci_menhir.ml" )) and iso_main = @@ -30477,7 +30478,7 @@ and iso_main = (Obj.magic (MenhirInterpreter.entry 10 lexer lexbuf) : ( # 162 "parser_cocci_menhir.mly" (Ast0_cocci.anything list list) -# 30481 "parser_cocci_menhir.ml" +# 30482 "parser_cocci_menhir.ml" )) and include_main = @@ -30485,7 +30486,7 @@ and include_main = (Obj.magic (MenhirInterpreter.entry 0 lexer lexbuf) : ( # 146 "parser_cocci_menhir.mly" ((string,string) Common.either list) -# 30489 "parser_cocci_menhir.ml" +# 30490 "parser_cocci_menhir.ml" )) diff --git a/parsing_cocci/parser_cocci_menhir.mli b/parsing_cocci/parser_cocci_menhir.mli index ea76966..2aef9fb 100644 --- a/parsing_cocci/parser_cocci_menhir.mli +++ b/parsing_cocci/parser_cocci_menhir.mli @@ -146,7 +146,7 @@ type token = | TDmOp of (Ast_cocci.arithOp * Data.clt) | TDisable | TDepends - | TDefineParam of (Data.clt * token * int) + | TDefineParam of (Data.clt * token * int * int) | TDefine of (Data.clt * token) | TDefault of (Data.clt) | TDeclarerId of (string * Data.clt) diff --git a/parsing_cocci/parser_cocci_menhir.mly b/parsing_cocci/parser_cocci_menhir.mly index 151401b..23c1c1e 100644 --- a/parsing_cocci/parser_cocci_menhir.mly +++ b/parsing_cocci/parser_cocci_menhir.mly @@ -79,7 +79,7 @@ module P = Parse_aux %token TPathIsoFile %token TIncludeL TIncludeNL %token TDefine -%token TDefineParam +%token TDefineParam %token TMinusFile TPlusFile %token TInc TDec @@ -687,11 +687,12 @@ defineop: Ast0.wrap Ast0.NoParams, body)) } | TDefineParam define_param_list_option TCPar - { let (clt,ident,parenoff) = $1 in + { let (clt,ident,parenoff,parencol) = $1 in + (* clt is the start of the #define itself *) let (arity,line,lline,offset,col,strbef,straft,pos) = clt in let lp = P.clt2mcode "(" - (arity,line,lline,parenoff,0,[],[],Ast0.NoMetaPos) in + (arity,line,lline,parenoff,parencol,[],[],Ast0.NoMetaPos) in function body -> Ast0.wrap (Ast0.Define @@ -905,7 +906,7 @@ stm_dots: { Ast0.wrap(Ast0.Nest(P.clt2mcode "<+..." a, b, P.clt2mcode "...+>" c, List.concat w, true)) } -whenppdecs: w=whens(when_start,rule_elem_statement) +whenppdecs: w=whens(when_start,rule_elem_statement,any_strict) { w } /* a statement that fits into a single rule_elem. should nests be included? @@ -1808,7 +1809,7 @@ edots_when(dotter,when_grammar): d=dotter { (d,None) } | d=dotter TWhen TNotEq w=when_grammar TLineEnd { (d,Some w) } -whens(when_grammar,simple_when_grammar): +whens(when_grammar,simple_when_grammar,any_strict): TWhen TNotEq w=when_grammar TLineEnd { [Ast0.WhenNot w] } | TWhen TEq w=simple_when_grammar TLineEnd { [Ast0.WhenAlways w] } | TWhen comma_list(any_strict) TLineEnd @@ -1822,6 +1823,11 @@ any_strict: | TForall { Ast.WhenForall } | TExists { Ast.WhenExists } +any_only: + TAny { Ast.WhenAny } + | TForall { Ast.WhenForall } + | TExists { Ast.WhenExists } + /***************************************************************************** * * diff --git a/parsing_cocci/pretty_print_cocci.ml b/parsing_cocci/pretty_print_cocci.ml index cc133bd..918d933 100644 --- a/parsing_cocci/pretty_print_cocci.ml +++ b/parsing_cocci/pretty_print_cocci.ml @@ -95,7 +95,7 @@ let print_pos = function | _ -> () let mcode fn = function - (x, _, Ast.MINUS(_,plus_stream), pos) -> + (x, _, Ast.MINUS(_,_,adj,plus_stream), pos) -> if !print_minus_flag then print_string (if !Flag.sgrep_mode2 then "*" else "-"); fn x; print_pos pos; @@ -112,7 +112,7 @@ let mcode fn = function print_string_befaft fn x info let print_mcodekind = function - Ast.MINUS(_,plus_stream) -> + Ast.MINUS(_,_,_,plus_stream) -> print_string "MINUS"; print_anything ">>> " plus_stream | Ast.CONTEXT(_,plus_streams) -> @@ -623,9 +623,8 @@ and print_define_param param = and statement arity s = match Ast.unwrap s with - Ast.Seq(lbrace,decls,body,rbrace) -> + Ast.Seq(lbrace,body,rbrace) -> rule_elem arity lbrace; - dots force_newline (statement arity) decls; dots force_newline (statement arity) body; rule_elem arity rbrace | Ast.IfThen(header,branch,(_,_,_,aft)) -> @@ -652,9 +651,8 @@ and statement arity s = List.iter (function x -> case_line arity x; force_newline()) cases; rule_elem arity rb | Ast.Atomic(re) -> rule_elem arity re - | Ast.FunDecl(header,lbrace,decls,body,rbrace) -> + | Ast.FunDecl(header,lbrace,body,rbrace) -> rule_elem arity header; rule_elem arity lbrace; - dots force_newline (statement arity) decls; dots force_newline (statement arity) body; rule_elem arity rbrace | Ast.Disj([stmt_dots]) -> diff --git a/parsing_cocci/single_statement.ml b/parsing_cocci/single_statement.ml index 4209f2f..d418203 100644 --- a/parsing_cocci/single_statement.ml +++ b/parsing_cocci/single_statement.ml @@ -327,7 +327,7 @@ and contains_only_minus = | _ -> false) | Ast0.CONTEXT(mc) -> false | _ -> false in - let mcode (_,_,_,mc,_) = mcodekind mc in + let mcode (_,_,_,mc,_,_) = mcodekind mc in let donothing r k e = mcodekind (Ast0.get_mcodekind e) && k e in diff --git a/parsing_cocci/unify_ast.ml b/parsing_cocci/unify_ast.ml index f29e4f7..f5631a8 100644 --- a/parsing_cocci/unify_ast.ml +++ b/parsing_cocci/unify_ast.ml @@ -522,13 +522,11 @@ and subtype f = let rec unify_statement s1 s2 = match (Ast.unwrap s1,Ast.unwrap s2) with - (Ast.Seq(lb1,d1,s1,rb1),Ast.Seq(lb2,d2,s2,rb2)) -> + (Ast.Seq(lb1,s1,rb1),Ast.Seq(lb2,s2,rb2)) -> conjunct_bindings (unify_rule_elem lb1 lb2) (conjunct_bindings (unify_dots unify_statement sdots s1 s2) - (conjunct_bindings - (unify_dots unify_statement sdots d1 d2) - (unify_rule_elem rb1 rb2))) + (unify_rule_elem rb1 rb2)) | (Ast.IfThen(h1,thn1,_),Ast.IfThen(h2,thn2,_)) -> conjunct_bindings (unify_rule_elem h1 h2) (unify_statement thn1 thn2) | (Ast.IfThenElse(h1,thn1,e1,els1,_),Ast.IfThenElse(h2,thn2,e2,els2,_)) -> @@ -558,12 +556,11 @@ let rec unify_statement s1 s2 = s2) | (Ast.Nest(s1,_,_,_,_),Ast.Nest(s2,_,_,_,_)) -> unify_dots unify_statement sdots s1 s2 - | (Ast.FunDecl(h1,lb1,d1,s1,rb1),Ast.FunDecl(h2,lb2,d2,s2,rb2)) -> + | (Ast.FunDecl(h1,lb1,s1,rb1),Ast.FunDecl(h2,lb2,s2,rb2)) -> conjunct_bindings (unify_rule_elem h1 h2) (conjunct_bindings (unify_rule_elem lb1 lb2) - (conjunct_bindings (unify_dots unify_statement sdots d1 d2) - (conjunct_bindings (unify_dots unify_statement sdots s1 s2) - (unify_rule_elem rb1 rb2)))) + (conjunct_bindings (unify_dots unify_statement sdots s1 s2) + (unify_rule_elem rb1 rb2))) | (Ast.Define(h1,s1),Ast.Define(h2,s2)) -> conjunct_bindings (unify_rule_elem h1 h2) (unify_dots unify_statement sdots s1 s2) diff --git a/parsing_cocci/unitary_ast0.ml b/parsing_cocci/unitary_ast0.ml index 4002eb9..c113c4d 100644 --- a/parsing_cocci/unitary_ast0.ml +++ b/parsing_cocci/unitary_ast0.ml @@ -40,7 +40,7 @@ let rec nub = function let minus_checker name = let id = Ast0.unwrap_mcode name in [id] (* take only what is in the plus code *) -let plus_checker (nm,_,_,mc,_) = +let plus_checker (nm,_,_,mc,_,_) = match mc with Ast0.PLUS -> [nm] | _ -> [] let get_free checker t = diff --git a/parsing_cocci/unparse_ast0.ml b/parsing_cocci/unparse_ast0.ml index 0772e54..39c5b46 100644 --- a/parsing_cocci/unparse_ast0.ml +++ b/parsing_cocci/unparse_ast0.ml @@ -26,6 +26,8 @@ module U = Pretty_print_cocci let quiet = ref true (* true = no decoration on - context, etc *) +let full_ids = ref false (* true = print rule name as well *) + let start_block str = force_newline(); print_string " "; open_box 0 @@ -77,7 +79,7 @@ let mcodekind brackets fn x info mc = (function x -> print_string lb; fn x; print_string rb) x plus_streams - | Ast0.PLUS -> fn x + | Ast0.PLUS -> print_int (info.Ast0.pos_info.Ast0.column); fn x | Ast0.MIXED(plus_streams) -> let (lb,rb) = if !quiet @@ -91,7 +93,7 @@ let mcodekind brackets fn x info mc = x plus_streams); List.iter (function (s,_) -> print_string s) info.Ast0.strings_after -let mcode fn (x,_,info,mc,pos) = +let mcode fn (x,_,info,mc,pos,adj) = let fn x = fn x; meta_pos !pos in mcodekind (Some info.Ast0.pos_info.Ast0.line_start)(*None*) fn x info mc @@ -99,7 +101,9 @@ let print_context x fn = mcodekind (Some (Ast0.get_line x)) fn () (Ast0.get_info x) (Ast0.get_mcodekind x) -let print_meta (_,name) = print_string name +let print_meta (ctx,name) = + if !full_ids then (print_string ctx; print_string ":"); + print_string name (* --------------------------------------------------------------------- *) (* --------------------------------------------------------------------- *) @@ -431,7 +435,7 @@ and statement arity s = mcode print_string iff; print_string " "; mcode print_string_box lp; expression exp; close_box(); mcode print_string rp; print_string " "; statement arity branch1; - mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos) + mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos,-1) | Ast0.IfThenElse(iff,lp,exp,rp,branch1,els,branch2,(info,aft)) -> print_string arity; mcode print_string iff; print_string " "; mcode print_string_box lp; @@ -439,13 +443,13 @@ and statement arity s = statement arity branch1; print_string arity; mcode print_string els; print_string " "; statement arity branch2; - mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos) + mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos,-1) | Ast0.While(whl,lp,exp,rp,body,(info,aft)) -> print_string arity; mcode print_string whl; print_string " "; mcode print_string_box lp; expression exp; close_box(); mcode print_string rp; print_string " "; statement arity body; - mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos) + mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos,-1) | Ast0.Do(d,body,whl,lp,exp,rp,sem) -> print_string arity; mcode print_string d; print_string " "; statement arity body; @@ -460,14 +464,14 @@ and statement arity s = print_option expression e2; mcode print_string sem2; print_option expression e3; close_box(); mcode print_string rp; print_string " "; statement arity body; - mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos) + mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos,-1) | Ast0.Iterator(nm,lp,args,rp,body,(info,aft)) -> print_string arity; ident nm; print_string " "; mcode print_string_box lp; let _ = dots (function _ -> ()) expression args in close_box(); mcode print_string rp; print_string " "; statement arity body; - mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos) + mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos,-1) | Ast0.Switch(switch,lp,exp,rp,lb,cases,rb) -> print_string arity; mcode print_string switch; print_string " "; diff --git a/parsing_cocci/visitor_ast.ml b/parsing_cocci/visitor_ast.ml index d01dc06..15e8f5d 100644 --- a/parsing_cocci/visitor_ast.ml +++ b/parsing_cocci/visitor_ast.ml @@ -411,8 +411,8 @@ let combiner bind option_default process_bef_aft s; let k s = match Ast.unwrap s with - Ast.Seq(lbrace,decls,body,rbrace) -> - multibind [rule_elem lbrace; statement_dots decls; + Ast.Seq(lbrace,body,rbrace) -> + multibind [rule_elem lbrace; statement_dots body; rule_elem rbrace] | Ast.IfThen(header,branch,_) -> multibind [rule_elem header; statement branch] @@ -436,10 +436,9 @@ let combiner bind option_default | Ast.Nest(stmt_dots,whn,_,_,_) -> bind (statement_dots stmt_dots) (multibind (List.map (whencode statement_dots statement) whn)) - | Ast.FunDecl(header,lbrace,decls,body,rbrace) -> + | Ast.FunDecl(header,lbrace,body,rbrace) -> multibind [rule_elem header; rule_elem lbrace; - statement_dots decls; statement_dots body; - rule_elem rbrace] + statement_dots body; rule_elem rbrace] | Ast.Define(header,body) -> bind (rule_elem header) (statement_dots body) | Ast.Dots(d,whn,_,_) | Ast.Circles(d,whn,_,_) | Ast.Stars(d,whn,_,_) -> @@ -920,8 +919,8 @@ let rebuilder let k s = Ast.rewrap s (match Ast.unwrap s with - Ast.Seq(lbrace,decls,body,rbrace) -> - Ast.Seq(rule_elem lbrace, statement_dots decls, + Ast.Seq(lbrace,body,rbrace) -> + Ast.Seq(rule_elem lbrace, statement_dots body, rule_elem rbrace) | Ast.IfThen(header,branch,aft) -> Ast.IfThen(rule_elem header, statement branch,aft) @@ -946,9 +945,8 @@ let rebuilder Ast.Nest(statement_dots stmt_dots, List.map (whencode statement_dots statement) whn, multi,bef,aft) - | Ast.FunDecl(header,lbrace,decls,body,rbrace) -> + | Ast.FunDecl(header,lbrace,body,rbrace) -> Ast.FunDecl(rule_elem header,rule_elem lbrace, - statement_dots decls, statement_dots body, rule_elem rbrace) | Ast.Define(header,body) -> Ast.Define(rule_elem header,statement_dots body) diff --git a/parsing_cocci/visitor_ast0.ml b/parsing_cocci/visitor_ast0.ml index 2938d41..4b97e31 100644 --- a/parsing_cocci/visitor_ast0.ml +++ b/parsing_cocci/visitor_ast0.ml @@ -503,10 +503,12 @@ let visitor mode bind option_default (match Ast0.unwrap p with Ast0.VoidParam(ty) -> let (n,ty) = typeC ty in (n,Ast0.VoidParam(ty)) - | Ast0.Param(ty,id) -> + | Ast0.Param(ty,Some id) -> + let ((ty_id_n,ty),id) = named_type ty id in + (ty_id_n, Ast0.Param(ty,Some id)) + | Ast0.Param(ty,None) -> let (ty_n,ty) = typeC ty in - let (id_n,id) = get_option ident id in - (bind ty_n id_n, Ast0.Param(ty,id)) + (ty_n, Ast0.Param(ty,None)) | Ast0.MetaParam(name,pure) -> let (n,name) = meta_mcode name in (n,Ast0.MetaParam(name,pure)) diff --git a/python/no_pycocci_aux.ml b/python/no_pycocci_aux.ml index 262b089..e9758ae 100644 --- a/python/no_pycocci_aux.ml +++ b/python/no_pycocci_aux.ml @@ -47,8 +47,8 @@ and constantrep c = match c with Ast_c.String (s,isWchar) -> s | Ast_c.MultiString _ -> "TODO: MultiString" | Ast_c.Char (s,isWchar) -> s -| Ast_c.Int s -> s -| Ast_c.Float (s,t) -> s +| Ast_c.Int (s, _t) -> s +| Ast_c.Float (s, _t) -> s let call_pretty f a = let str = ref ([] : string list) in diff --git a/readme.txt b/readme.txt index bcc2b2d..d75d5fa 100644 --- a/readme.txt +++ b/readme.txt @@ -1,33 +1,39 @@ + Coccinelle + + Coccinelle allows programmers to easily write some complex style-preserving source-to-source transformations on C source code, like for instance to perform some refactorings. To install Coccinelle from its source, see the instructions in install.txt. -For more information on Coccinelle, type 'make docs' and see look at the -files in the docs/ directory. You may need to install the texlive-fonts-extra -packages from your distribution to compile some of the LaTeX documentation -files. - Once you have installed Coccinelle (either from the source or from one of the binary form available on the Coccinelle website), You may have to setup a few environment variables so that the Coccinelle program -know where to find its configuration files. +knows where to find its configuration files. For bash do: - source env.sh + $ source env.sh For tcsh do: - source env.csh + $ source env.csh You can then test coccinelle with: - spatch -sp_file demos/simple.cocci demos/simple.c + $ spatch -sp_file demos/simple.cocci demos/simple.c If you downloaded the bytecode version of spatch you may first have to install OCaml (which contains the 'ocamlrun' bytecode interpreter, the equivalent of 'java', the Java virtual machine, but for OCaml) and then do: - ocamlrun spatch -sp_file demos/simple.cocci demos/simple.c + $ ocamlrun spatch -sp_file demos/simple.cocci demos/simple.c + + + +For more information on Coccinelle, type 'make docs' and have a look at the +files in the docs/ directory. You may need to install the texlive-fonts-extra +packages from your distribution to compile some of the LaTeX documentation +files. + diff --git a/standard.h b/standard.h index ff30864..42d5537 100644 --- a/standard.h +++ b/standard.h @@ -1,19 +1,29 @@ -// clone: yacfe(master), coccinelle, acomment, - // **************************************************************************** -// Prelude, this file is to be used with the -macro_file option of the C parser +// Prelude, this file is used with -macro_file_builtins option of the C parser // **************************************************************************** /* This file contains: * - macros found in <.h> + * - macros found in ".h" + * but where we cant detect that it will be a "bad macro" + * - hints, cf below. + * + * A "bad macro" is a macro using free variables or when expanded + * that influence the control-flow of the code. In those cases it + * is preferable to expand the macro so that the coccinelle engine + * has a more accurate representation of what is going on. + * + * + * + * + * old: this file was also containing what is below but now we + * try to expand on demand the macro found in the c file, so those cases + * are not needed any more: * - macros found in .c; macros that cannot be parsed. * In the future should be autodetected * (not so easy to do same for macros in .h cos require to access .h file) - * - macros found in ".h" - * but where we cant detect that it will be a "bad macro" * - macros found in .c; macros correctly parsed * but where we cant detect that it will be a "bad macro" - * - hints, cf below. * * Some of those macros could be deleted and the C code rewritten because * they are "bad" macros. @@ -54,28 +64,19 @@ // #define FOO(a,b) fn(a,b) #define FOO_METH_TEST(a) YACFE_IDENT_BUILDER -// **************************************************************************** -// Generic macros -// **************************************************************************** +//#define FOO YACFE_DECLARATOR // **************************************************************************** -// Yacc macros -// **************************************************************************** - -#define YY_PROTO(x) x -#define yyconst const - - -// **************************************************************************** -// GNU Hello macros +// Generic macros // **************************************************************************** -#define __getopt_argv_const const +// this is defined by windows compiler, and so can not be found via a macro +// after a -extract_macros +#define __stdcall /*could: YACFE_ATTRIBUTE*/ +#define __declspec(a) - -// **************************************************************************** -// Gcc (as in the source of gcc code) macros -// **************************************************************************** +#define WINAPI +#define CALLBACK // **************************************************************************** @@ -183,6 +184,14 @@ #define __uses_jump_to_uncached + +// last last +#define __net_init +#define __net_exit +#define __net_initdata + +#define __paginginit // in mm + // ---------------------------------------------------------------------------- // String macros // ---------------------------------------------------------------------------- @@ -270,6 +279,10 @@ #define TRACE_EXIT return +#define notrace + +#define noinline_for_stack // in fs +#define debug_noinline // in net // ---------------------------------------------------------------------------- // linkage @@ -734,71 +747,3 @@ do { \ //#define ACPI_MODULE_NAME(x) - - -// **************************************************************************** -// Httpd (apache) macros -// **************************************************************************** - -#define AP_DECLARE(x) x -#define PROXY_DECLARE(x) x -#define CACHE_DECLARE(x) x -#define DBD_DECLARE_NONSTD(x) x -#define DAV_DECLARE(x) x -#define APU_DECLARE(x) x -#define APU_DECLARE_NONSTD(x) x -#define APR_DECLARE(x) x -#define AP_CORE_DECLARE(x) x -#define AP_DECLARE_NONSTD(x) x -#define AP_CORE_DECLARE_NONSTD(x) x -#define APR_OPTIONAL_FN_TYPE(x) x -#define DAV_DECLARE_NONSTD(x) x -#define APR_DECLARE_NONSTD(x) x - -#define APU_DECLARE_DATA -#define APR_THREAD_FUNC -#define AP_DECLARE_DATA -#define PROXY_DECLARE_DATA -#define AP_MODULE_DECLARE_DATA -#define APR_DECLARE_DATA - - - -#define APR_INLINE inline -#define EXPORT static -#define REGISTER register - -#define MODSSL_D2I_SSL_SESSION_CONST const -#define MODSSL_D2I_X509_CONST const -#define MODSSL_D2I_PrivateKey_CONST const -#define MODSSL_D2I_SSL_SESSION_CONST const - -#define STACK_OF(X509_NAME) X509_NAME - -#define MODSSL_PCHAR_CAST (pchar) - -#define WINAPI -//#define CALLBACK -// generate false positive in Linux -#define APIENTRY -#define __declspec(x) -#define __stdcall - - -//#define module struct xxx - -#define APR_POOL_IMPLEMENT_ACCESSOR(shm) - -#define ADD_SUITE(suite) suite; - -// **************************************************************************** -// CISCO vpn client macros -// **************************************************************************** - -// #define NOREGPARM -// #define IN -// #define OUT -// #define OPTIONAL - -#define likely(x) x -#define unlikely(x) x diff --git a/standard.iso b/standard.iso index 8d6c161..123e95b 100644 --- a/standard.iso +++ b/standard.iso @@ -271,6 +271,12 @@ expression X, Y; @@ X < Y <=> Y > X +Expression +@ gtr_lss_eq @ +expression X, Y; +@@ +X <= Y <=> Y >= X + // --------------------------------------------------------------------------- // Increment isomorphisms // --------------------------------------------------------------------------- diff --git a/testing.ml b/testing.ml index 8dffbb7..b488d72 100644 --- a/testing.ml +++ b/testing.ml @@ -68,8 +68,18 @@ let testone x compare_with_expected_flag = (* ------------------------------------------------------------------------ *) -let testall () = - +(* note: if you get some weird results in -testall, and not in -test, + * it is possible that a test file work in -test but may not + * work while used inside a -testall. If we have some bugs in our + * parser that modify some global state and that those states + * are not reseted between each test file, then having run previous + * test files may have an influence on another test file which mean + * than a test may work in isolation (via -test) but not otherwise + * (via -testall). Fortunately such bugs are rare. + * + *) +let testall ?(expected_score_file="tests/SCORE_expected.sexp") () = + let score = empty_score () in let expected_result_files = @@ -93,6 +103,8 @@ let testall () = try ( Common.timeout_function timeout_testall (fun () -> + pr2 res; + let cocci_infos = Cocci.pre_engine (cocci_file, !Config.std_iso) in let xs = Cocci.full_engine cocci_infos [cfile] in Cocci.post_engine cocci_infos; @@ -106,7 +118,6 @@ let testall () = let (correct, diffxs) = Compare_c.compare_default generated expected in - pr2 res; (* I don't use Compare_c.compare_result_to_string because * I want to indent a little more the messages. *) @@ -155,18 +166,31 @@ let testall () = pr2 "--------------------------------"; pr2 "regression testing information"; pr2 "--------------------------------"; - + + (* now default argument of testall: let expected_score_file = "tests/SCORE_expected.sexp" in + *) + let expected_score_file_orig = "tests/SCORE_expected_orig.sexp" in let best_of_both_file = "tests/SCORE_best_of_both.sexp" in let actual_score_file = "tests/SCORE_actual.sexp" in - + pr2 ("regression file: "^ expected_score_file); let (expected_score : score) = if Sys.file_exists expected_score_file then let sexp = Sexp.load_sexp expected_score_file in Sexp_common.score_of_sexp sexp - else empty_score() + else + if Sys.file_exists expected_score_file_orig + then begin + pr2 (spf "use expected orig file (%s)" expected_score_file_orig); + Common.command2 (spf "cp %s %s" expected_score_file_orig + expected_score_file); + let sexp = Sexp.load_sexp expected_score_file in + Sexp_common.score_of_sexp sexp + end + else + empty_score() in let new_bestscore = Common.regression_testing_vs score expected_score in @@ -195,7 +219,8 @@ let testall () = else if good < expected_good then begin - pr2 "Current score is lower than expected, :("; + pr2 "Current score is lower than expected :("; + pr2 (spf "(was expecting %d but got %d)" expected_good good); pr2 ""; pr2 "If you think it's normal, then maybe you need to update the"; pr2 (spf "score file %s, copying info from %s." @@ -203,7 +228,8 @@ let testall () = raise (UnixExit 1); end else begin - pr2 "Current score is greater than expected, :)"; + pr2 "Current score is greater than expected :)"; + pr2 (spf "(was expecting %d but got %d)" expected_good good); pr2 "Generating new expected score file and saving old one"; Common.command2_y_or_no_exit_if_no (spf "mv %s %s" expected_score_file (expected_score_file ^ ".save")); diff --git a/testing.mli b/testing.mli index 8fcbfcd..bd0579a 100644 --- a/testing.mli +++ b/testing.mli @@ -4,7 +4,7 @@ open Common (* work with tests/ *) (*****************************************************************************) val testone : string (*test*) -> bool (*compare_expected*) -> unit -val testall : unit -> unit +val testall : ?expected_score_file:string -> unit -> unit (*****************************************************************************) (* works with tests-big/. The .res, .ok, .spatch_ok, .failed, .var *) diff --git a/tests/SCORE_expected.sexp b/tests/SCORE_expected.sexp index 74987fd..b1225a1 100644 --- a/tests/SCORE_expected.sexp +++ b/tests/SCORE_expected.sexp @@ -8,12 +8,12 @@ (bad_ptr_print.res Ok) (bad_typedef.res Ok) (badexp.res Ok) (badpos.res (Pb - "PROBLEM\n exn = Failure(\"rule starting on line 1: already tagged token:\\nFile \\\"tests/badpos.c\\\", line 5, column 30, charpos = 139\\n around = 'reg_ptr', whole content = \\t (int) -(((struct pt_regs *) reg_ptr)->orig_eax + 2));\")\n")) - (badtypedef.res Ok) (ben.res Ok) (bitfield.res Ok) (braces.res Ok) - (break.res Ok) (bug1.res Ok) + "PROBLEM\n exn = Failure(\"rule starting on line 1: already tagged token:\\nC code context\\nFile \\\"tests/badpos.c\\\", line 5, column 30, charpos = 139\\n around = 'reg_ptr', whole content = \\t (int) -(((struct pt_regs *) reg_ptr)->orig_eax + 2));\")\n")) + (badtypedef.res Ok) (badzero.res Ok) (ben.res Ok) (bitfield.res Ok) + (braces.res Ok) (break.res Ok) (bug1.res Ok) (bugloop.res (Pb - "PROBLEM\n exn = Failure(\"try to delete an expanded token: flags\")\n")) + "INCORRECT:diff token: PF_FREEZE VS )\nFile , line 12, column 16, charpos = 390\n around = 'PF_FREEZE', whole content = \t\t\trefrigerator(PF_FREEZE);\nFile \"tests/bugloop.res\", line 8, column 16, charpos = 160\n around = ')', whole content = \t\t\trefrigerator();\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,7 +1,3 @@\n -/* this doesn't work, because on the paths where we don't find refrigerator,\n -we expect to reach Exit without first going through current->flags & PF_FREEZE,\n -but of course any path that goes around the loop does precisely that */\n -\n static int stir_transmit_thread(void *arg)\n {\n \n @@ -9,7 +5,7 @@\n \t{\n \t\t/* if suspending, then power off and wait */\n \t\tif (unlikely(freezing(current))) {\n -\t\t\trefrigerator(PF_FREEZE);\n +\t\t\trefrigerator();\n \n \t\t}\n \t}\n")) (bugon.res Ok) (cards.res Ok) (cast.res Ok) (cast_iso.res Ok) (compare.res Ok) (const.res Ok) (const1bis.res Ok) (const_adding.res Ok) (const_array.res Ok) (const_implicit_iso.res Ok) (constty.res Ok) @@ -29,23 +29,26 @@ (define_exp.res Ok) (define_param.res Ok) (deftodo.res Ok) (deref.res Ok) (devlink.res Ok) (disjexpr.res Ok) (disjexpr_ver1.res Ok) (disjexpr_ver2.res Ok) (distribute.res Ok) (double.res Ok) - (double_assign.res Ok) - (double_switch.res (Pb "PROBLEM\n exn = Common.Impossible\n")) - (doublepos.res Ok) - (doubleswitch.res (Pb "PROBLEM\n exn = Common.Impossible\n")) - (dowhile.res Ok) (dropf.res Ok) (dropparam.res Ok) (edots.res Ok) - (edots_ver1.res Ok) (empty.res Ok) (end_commas.res Ok) (endif.res Ok) - (exp.res Ok) (expnest.res Ok) (expopt.res Ok) (expopt2.res Ok) - (expopt3.res Ok) (expopt3_ver1.res Ok) (expopt3_ver2.res Ok) (fields.res Ok) - (fieldsmin.res Ok) (fix_flow_need.res Ok) (fn_todo.res Ok) (fnptr.res Ok) - (fnret.res Ok) (four.res Ok) (foura.res Ok) (fp.res Ok) (fun.res Ok) + (double_assign.res Ok) (double_switch.res Ok) (doublepos.res Ok) + (doubleswitch.res Ok) (dowhile.res Ok) (dropf.res Ok) (dropparam.res Ok) + (edots.res Ok) (edots_ver1.res Ok) (empty.res Ok) (end_commas.res Ok) + (endif.res Ok) (exp.res Ok) (expnest.res Ok) (expopt.res Ok) + (expopt2.res Ok) (expopt3.res Ok) (expopt3_ver1.res Ok) + (expopt3_ver2.res Ok) (fields.res Ok) (fieldsmin.res Ok) (find_long.res Ok) + (fix_flow_need.res Ok) (fn_todo.res Ok) (fnptr.res Ok) (fnret.res Ok) + (four.res Ok) (foura.res Ok) (fp.res Ok) (fun.res Ok) (gilles-question.res Ok) (gotobreak.res Ok) (hd.res Ok) (headers.res Ok) - (hex.res Ok) - (hil1.res Ok) (if.res Ok) (ifbr.res Ok) (ifdef1.res Ok) (ifdef2.res Ok) + (hex.res Ok) (hil1.res Ok) (if.res Ok) (ifbr.res Ok) (ifdef1.res Ok) + (ifdef2.res Ok) (ifdef3.res (Pb "PROBLEM\n exn = Lexer_cocci.Lexical(\"unrecognised symbol, in token rule: #\")\n")) (ifdef4.res Ok) (ifdef5.res Ok) (ifdef6.res Ok) (ifdef6a.res Ok) + (ifdefmeta.res Ok) (ifdefmeta1.res Ok) (ifdefmeta2.res Ok) + (ifdefmeta3.res Ok) + (ifdefmeta4.res + (Pb + "PROBLEM\n exn = Unix.Unix_error(20, \"stat\", \"tests/ifdefmeta4.cocci\")\n")) (ifend.res Ok) (ifzer.res Ok) (inc.res Ok) (incdir.res (Pb @@ -58,17 +61,15 @@ (jloop1.res (Pb "PROBLEM\n exn = Failure(\"minus: parse error: \\n = File \\\"tests/jloop1.cocci\\\", line 10, column 3, charpos = 129\\n around = '...>', whole content = ...>\\n\")\n")) - (julia10.res Ok) (julia7.res Ok) (keep_comma.res Ok) - (km.res - (Pb - "INCORRECT:diff token: } VS memset\nFile , line 4, column 0, charpos = 85\n around = '}', whole content = }\nFile \"tests/km.res\", line 4, column 2, charpos = 87\n around = 'memset', whole content = memset(data, 0, element->string.length + 1);\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,4 +1,5 @@\n int main() {\n int *data = kzalloc(element->string.length + 1, GFP_KERNEL);\n foo();\n + memset(data, 0, element->string.length + 1);\n }\n")) + (julia10.res Ok) (julia7.res Ok) (keep_comma.res Ok) (km.res Ok) (kmalloc.res Ok) (kmc.res Ok) (ktype.res Ok) (labels_metastatement.res (Pb "INCORRECT:diff token: { VS x\nFile , line 4, column 2, charpos = 30\n around = '{', whole content = {\nFile \"tests/labels_metastatement.res\", line 4, column 4, charpos = 32\n around = 'x', whole content = x = 3; foo();\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,15 +1,10 @@\n int foo(int i) {\n \n if(1) {\n - {\n - x = 3;\n - foo();\n - z = 4;\n - foo();\n - }\n - foo();\n - }\n - foo(); // we dont want that it add both foo on the } and on the endif\n + x = 3; foo();\n + z = 4; foo();\n + } // we dont want that it add both foo on the } and on the endif\n // (note: but need correct endif accrochage)\n + foo();\n \n }\n")) (labels_metastatement_ver1.res Ok) (local.res Ok) (localid.res Ok) - (longlong.res Ok) (longlongint.res Ok) (loop.res Ok) (lvalue.res Ok) - (macro.res Ok) (match_no_meta.res Ok) (max.res Ok) + (longconst.res Ok) (longlong.res Ok) (longlongint.res Ok) (loop.res Ok) + (lvalue.res Ok) (macro.res Ok) (macro_int16.res Ok) (match_no_meta.res Ok) + (max.res Ok) (metahex.res (Pb "INCORRECT:diff token: f VS }\nFile \"tests/metahex.c\", line 2, column 2, charpos = 15\n around = 'f', whole content = f(3);\nFile \"tests/metahex.res\", line 2, column 0, charpos = 13\n around = '}', whole content = }\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,4 +1,2 @@\n int main() {\n - f(3);\n - g(0x03);\n }\n")) @@ -81,10 +82,13 @@ (multiplus.res Ok) (multitype.res Ok) (multitypedef.res Ok) (multivars.res Ok) (nest.res Ok) (nestone.res Ok) (nestseq.res Ok) (neststruct.res Ok) (nl.res Ok) (nocast.res Ok) (not.res Ok) (noty.res Ok) - (null_type.res Ok) (of.res Ok) (oneline.res Ok) (opt.res Ok) - (optional_qualifier.res Ok) (optional_storage.res Ok) (orexp.res Ok) - (param.res Ok) (param_end.res Ok) (param_ver1.res Ok) - (parameters_dots.res Ok) (partial.res Ok) + (null_type.res Ok) + (oddifdef.res + (Pb + "INCORRECT:diff token: #else\n VS x\nFile , line 10, column 0, charpos = 114\n around = '#else\n', whole content = #else\nFile \"tests/oddifdef.res\", line 10, column 2, charpos = 116\n around = 'x', whole content = x = 0;\n\n diff (result(<) vs expected_result(>)) = \n @@ -7,8 +7,9 @@\n a = 5;\n \n #ifdef FOO\n + x = 0;\n #else\n - \n + x = 0;\n #endif\n }\n \n @@ -21,8 +22,9 @@\n a = 3;\n \n #ifdef FOO\n + x = 0;\n #else\n - \n + x = 0;\n #endif\n }\n \n @@ -35,7 +37,8 @@\n #endif\n \n #ifdef FOO\n + x = 0;\n #else\n - \n + x = 0;\n #endif\n }\n")) + (of.res Ok) (oneline.res Ok) (opt.res Ok) (optional_qualifier.res Ok) + (optional_storage.res Ok) (orexp.res Ok) (param.res Ok) (param_end.res Ok) + (param_ver1.res Ok) (parameters_dots.res Ok) (partial.res Ok) (pb_distribute_type.res (Pb "INCORRECT:PB parsing only in generated-file\n diff (result(<) vs expected_result(>)) = \n @@ -5,11 +5,11 @@\n \n \n int foo() {\n - int * *x;\n + int **x;\n return 0;\n }\n \n int foo() {\n - int[45] *x;\n + int (*x)[45];\n return 0;\n }\n")) @@ -142,4 +146,4 @@ (wierdinit.res (Pb "seems incorrect, but only because of code that was not parsablediff token: dev_link_t VS struct\nFile \"tests/wierdinit.c\", line 4, column 1, charpos = 27\n around = 'dev_link_t', whole content = \tdev_link_t *link;\nFile \"tests/wierdinit.res\", line 4, column 1, charpos = 27\n around = 'struct', whole content = \tstruct pcmcia_device *link;\n")) - (ws2.res Ok) (y2.res Ok) (zero.res Ok)) \ No newline at end of file + (ws2.res Ok) (xfield.res Ok) (y2.res Ok) (zero.res Ok)) \ No newline at end of file diff --git a/tests/SCORE_expected.sexp.save b/tests/SCORE_expected.sexp.save new file mode 100644 index 0000000..4e37271 --- /dev/null +++ b/tests/SCORE_expected.sexp.save @@ -0,0 +1,151 @@ +((a3d.res Ok) (a_and_e.res Ok) (a_and_e_ver1.res Ok) (addelse.res Ok) + (addif.res Ok) (addif1.res Ok) (addif2.res Ok) (after_if.res Ok) + (anon.res Ok) (ar.res Ok) (arg.res Ok) (argument.res Ok) (array_init.res Ok) + (array_size.res Ok) (arraysz.res Ok) (b1.res Ok) (b2.res Ok) + (bad_iso_example.res + (Pb + "INCORRECT:diff token: ( VS x\nFile \"tests/bad_iso_example.c\", line 2, column 6, charpos = 19\n around = '(', whole content = if ((x = 3)) return;\nFile \"tests/bad_iso_example.res\", line 2, column 6, charpos = 19\n around = 'x', whole content = if (x) return;\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,4 +1,4 @@\n int main() {\n - if ((x = 3)) return;\n + if (x) return;\n }\n \n")) + (bad_ptr_print.res Ok) (bad_typedef.res Ok) (badexp.res Ok) + (badpos.res + (Pb + "PROBLEM\n exn = Failure(\"rule starting on line 1: already tagged token:\\nFile \\\"tests/badpos.c\\\", line 5, column 30, charpos = 139\\n around = 'reg_ptr', whole content = \\t (int) -(((struct pt_regs *) reg_ptr)->orig_eax + 2));\")\n")) + (badtypedef.res Ok) (badzero.res Ok) (ben.res Ok) (bitfield.res Ok) + (braces.res Ok) (break.res Ok) (bug1.res Ok) + (bugloop.res + (Pb + "INCORRECT:diff token: PF_FREEZE VS )\nFile , line 12, column 16, charpos = 390\n around = 'PF_FREEZE', whole content = \t\t\trefrigerator(PF_FREEZE);\nFile \"tests/bugloop.res\", line 8, column 16, charpos = 160\n around = ')', whole content = \t\t\trefrigerator();\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,7 +1,3 @@\n -/* this doesn't work, because on the paths where we don't find refrigerator,\n -we expect to reach Exit without first going through current->flags & PF_FREEZE,\n -but of course any path that goes around the loop does precisely that */\n -\n static int stir_transmit_thread(void *arg)\n {\n \n @@ -9,7 +5,7 @@\n \t{\n \t\t/* if suspending, then power off and wait */\n \t\tif (unlikely(freezing(current))) {\n -\t\t\trefrigerator(PF_FREEZE);\n +\t\t\trefrigerator();\n \n \t\t}\n \t}\n")) + (bugon.res Ok) (cards.res Ok) (cast.res Ok) (cast_iso.res Ok) + (compare.res Ok) (const.res Ok) (const1bis.res Ok) (const_adding.res Ok) + (const_array.res Ok) (const_implicit_iso.res Ok) (constty.res Ok) + (constx.res Ok) (cs_check.res Ok) (cst.res Ok) (csw.res Ok) + (dbg.res + (Pb + "INCORRECT:diff token: else VS (\nFile , line 8, column 2, charpos = 133\n around = 'else', whole content = \t\telse pr = NULL;;\nFile \"tests/dbg.res\", line 7, column 5, charpos = 130\n around = '(', whole content = \t\tDBG(\"PCI\");\n\n diff (result(<) vs expected_result(>)) = \n @@ -4,6 +4,6 @@\n \tstruct resource *pr, *r = &dev->resource[idx];\n \n \tif (pr)\n -\t\tDBG\n -\t\telse pr = NULL;;\n +\t\tDBG(\"PCI\");\n +\telse pr = NULL;\n }\n")) + (dc_close.res Ok) (debug.res Ok) (dec.res Ok) (decl.res Ok) (decl2.res Ok) + (decl_space.res Ok) + (decl_split.res + (Pb + "INCORRECT:diff token: int VS }\nFile \"tests/decl_split.c\", line 2, column 8, charpos = 27\n around = 'int', whole content = int x, y;\nFile \"tests/decl_split.res\", line 2, column 0, charpos = 19\n around = '}', whole content = }\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,3 +1,2 @@\n int func(int i) { \n - int x, y;\n }\n")) + (define_exp.res Ok) (define_param.res Ok) (deftodo.res Ok) (deref.res Ok) + (devlink.res Ok) (disjexpr.res Ok) (disjexpr_ver1.res Ok) + (disjexpr_ver2.res Ok) (distribute.res Ok) (double.res Ok) + (double_assign.res Ok) (double_switch.res Ok) (doublepos.res Ok) + (doubleswitch.res Ok) (dowhile.res Ok) (dropf.res Ok) (dropparam.res Ok) + (edots.res Ok) (edots_ver1.res Ok) (empty.res Ok) (end_commas.res Ok) + (endif.res Ok) (exp.res Ok) (expnest.res Ok) (expopt.res Ok) + (expopt2.res Ok) (expopt3.res Ok) (expopt3_ver1.res Ok) + (expopt3_ver2.res Ok) (fields.res Ok) (fieldsmin.res Ok) (find_long.res Ok) + (fix_flow_need.res Ok) (fn_todo.res Ok) (fnptr.res Ok) (fnret.res Ok) + (four.res Ok) (foura.res Ok) (fp.res Ok) (fun.res Ok) + (gilles-question.res Ok) (gotobreak.res Ok) (hd.res Ok) (headers.res Ok) + (hex.res Ok) (hil1.res Ok) (if.res Ok) (ifbr.res Ok) (ifdef1.res Ok) + (ifdef2.res Ok) + (ifdef3.res + (Pb + "PROBLEM\n exn = Lexer_cocci.Lexical(\"unrecognised symbol, in token rule: #\")\n")) + (ifdef4.res Ok) (ifdef5.res Ok) (ifdef6.res Ok) (ifdef6a.res Ok) + (ifdefmeta.res Ok) (ifdefmeta1.res Ok) (ifdefmeta2.res Ok) + (ifdefmeta3.res + (Pb + "INCORRECT:diff token: g VS #ifdef ONE\nFile , line 4, column 2, charpos = 32\n around = 'g', whole content = g();\nFile \"tests/ifdefmeta3.res\", line 4, column 0, charpos = 30\n around = '#ifdef ONE', whole content = #ifdef ONE\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,5 +1,7 @@\n int main () {\n f();\n xxx();\n +#ifdef ONE\n +#endif\n g();\n }\n")) + (ifdefmeta4.res + (Pb + "PROBLEM\n exn = Unix.Unix_error(20, \"stat\", \"tests/ifdefmeta4.cocci\")\n")) + (ifend.res Ok) (ifzer.res Ok) (inc.res Ok) + (incdir.res + (Pb + "INCORRECT:diff token: x VS 12\nFile \"tests/incdir.c\", line 4, column 6, charpos = 46\n around = 'x', whole content = foo(x);\nFile \"tests/incdir.res\", line 4, column 6, charpos = 46\n around = '12', whole content = foo(12);\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,5 +1,5 @@\n #include \"sub/incdir2.c\"\n \n int main () {\n - foo(x);\n + foo(12);\n }\n")) + (incl.res Ok) (inclifdef.res Ok) (include.res Ok) + (incompatible_value.res Ok) (inherited.res Ok) (inherited_ver1.res Ok) + (inhpos.res Ok) (initializer.res Ok) (initializer_many_fields.res Ok) + (inline.res Ok) (isococci.res Ok) (isotest.res Ok) (isotest2.res Ok) + (iterator.res Ok) + (jloop1.res + (Pb + "PROBLEM\n exn = Failure(\"minus: parse error: \\n = File \\\"tests/jloop1.cocci\\\", line 10, column 3, charpos = 129\\n around = '...>', whole content = ...>\\n\")\n")) + (julia10.res Ok) (julia7.res Ok) (keep_comma.res Ok) (km.res Ok) + (kmalloc.res Ok) (kmc.res Ok) (ktype.res Ok) + (labels_metastatement.res + (Pb + "INCORRECT:diff token: { VS x\nFile , line 4, column 2, charpos = 30\n around = '{', whole content = {\nFile \"tests/labels_metastatement.res\", line 4, column 4, charpos = 32\n around = 'x', whole content = x = 3; foo();\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,15 +1,10 @@\n int foo(int i) {\n \n if(1) {\n - {\n - x = 3;\n - foo();\n - z = 4;\n - foo();\n - }\n - foo();\n - }\n - foo(); // we dont want that it add both foo on the } and on the endif\n + x = 3; foo();\n + z = 4; foo();\n + } // we dont want that it add both foo on the } and on the endif\n // (note: but need correct endif accrochage)\n + foo();\n \n }\n")) + (labels_metastatement_ver1.res Ok) (local.res Ok) (localid.res Ok) + (longconst.res Ok) (longlong.res Ok) (longlongint.res Ok) (loop.res Ok) + (lvalue.res Ok) (macro.res Ok) (macro_int16.res Ok) (match_no_meta.res Ok) + (max.res Ok) + (metahex.res + (Pb + "INCORRECT:diff token: f VS }\nFile \"tests/metahex.c\", line 2, column 2, charpos = 15\n around = 'f', whole content = f(3);\nFile \"tests/metahex.res\", line 2, column 0, charpos = 13\n around = '}', whole content = }\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,4 +1,2 @@\n int main() {\n - f(3);\n - g(0x03);\n }\n")) + (metaruleelem.res Ok) (metastatement2.res Ok) (metastatement_for.res Ok) + (metastatement_if.res Ok) (minstruct.res Ok) (minusdots.res Ok) + (minusdots_ver1.res Ok) + (multi_func1.res + (Pb + "PROBLEM\n exn = Failure(\"minus: parse error: \\n = File \\\"tests/multi_func1.cocci\\\", line 12, column 2, charpos = 102\\n around = 'fn2', whole content = fn2(...) {\\n\")\n")) + (multiplus.res Ok) (multitype.res Ok) (multitypedef.res Ok) + (multivars.res Ok) (nest.res Ok) (nestone.res Ok) (nestseq.res Ok) + (neststruct.res Ok) (nl.res Ok) (nocast.res Ok) (not.res Ok) (noty.res Ok) + (null_type.res Ok) + (oddifdef.res + (Pb + "INCORRECT:diff token: #else\n VS x\nFile , line 10, column 0, charpos = 114\n around = '#else\n', whole content = #else\nFile \"tests/oddifdef.res\", line 10, column 2, charpos = 116\n around = 'x', whole content = x = 0;\n\n diff (result(<) vs expected_result(>)) = \n @@ -7,8 +7,9 @@\n a = 5;\n \n #ifdef FOO\n + x = 0;\n #else\n - \n + x = 0;\n #endif\n }\n \n @@ -21,8 +22,9 @@\n a = 3;\n \n #ifdef FOO\n + x = 0;\n #else\n - \n + x = 0;\n #endif\n }\n \n @@ -35,7 +37,8 @@\n #endif\n \n #ifdef FOO\n + x = 0;\n #else\n - \n + x = 0;\n #endif\n }\n")) + (of.res Ok) (oneline.res Ok) (opt.res Ok) (optional_qualifier.res Ok) + (optional_storage.res Ok) (orexp.res Ok) (param.res Ok) (param_end.res Ok) + (param_ver1.res Ok) (parameters_dots.res Ok) (partial.res Ok) + (pb_distribute_type.res + (Pb + "INCORRECT:PB parsing only in generated-file\n diff (result(<) vs expected_result(>)) = \n @@ -5,11 +5,11 @@\n \n \n int foo() {\n - int * *x;\n + int **x;\n return 0;\n }\n \n int foo() {\n - int[45] *x;\n + int (*x)[45];\n return 0;\n }\n")) + (pb_distribute_type2.res + (Pb + "INCORRECT:PB parsing only in generated-file\n diff (result(<) vs expected_result(>)) = \n @@ -1,5 +1,5 @@\n int foo() {\n - int* x;\n + int *x;\n return 0;\n }\n \n @@ -10,6 +10,6 @@\n }\n \n int foo() {\n - int x[45]*;\n + int (*x)[45];\n return 0;\n }\n")) + (pb_distribute_type3.res + (Pb "PROBLEM\n exn = Failure(\"line 7: index 53 53 already used\\n\")\n")) + (pb_distribute_type4.res Ok) (pb_params_iso.res Ok) + (pb_parsing_macro.res Ok) (pb_tag_symbols.res Ok) (pmac.res Ok) + (posiso.res Ok) (positionc.res Ok) (post.res Ok) (print_return.res Ok) + (proto.res Ok) (proto2.res Ok) (proto_ver1.res Ok) (proto_ver2.res Ok) + (protoassert.res Ok) (protox.res Ok) (rcu3.res Ok) + (remstruct.res + (Pb + "INCORRECT:not same number of entities (func, decl, ...)\n diff (result(<) vs expected_result(>)) = \n @@ -1,10 +1,3 @@\n -\n - .ack = mpuio_ack_irq,\n - .mask = mpuio_mask_irq,\n - .unmask = mpuio_unmask_irq\n -\n - .b = 15,\n -\n int hello ( String input )\n {\n String input = input.lowercase();\n")) + (replace_typedef.res Ok) (reserved.res Ok) (retmacro.res Ok) (rets.res Ok) + (return.res Ok) (return_implicit.res Ok) (same_expr.res Ok) + (scope_problem.res + (Pb + "INCORRECT:diff token: } VS a\nFile , line 6, column 2, charpos = 44\n around = '}', whole content = }\nFile \"tests/scope_problem.res\", line 7, column 4, charpos = 49\n around = 'a', whole content = a = 2;\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,8 +1,10 @@\n void main(int i) {\n \n \n +\n if(1) {\n int a;\n + a = 2;\n }\n \n \n")) + (serio.res + (Pb + "INCORRECT:diff token: init_MUTEX VS mutex_init\nFile \"tests/serio.c\", line 7, column 1, charpos = 130\n around = 'init_MUTEX', whole content = \tinit_MUTEX(&serio->drv_sem);\nFile \"tests/serio.res\", line 7, column 1, charpos = 130\n around = 'mutex_init', whole content = \tmutex_init(&serio->new_lock);\n\n diff (result(<) vs expected_result(>)) = \n @@ -4,5 +4,5 @@\n \n static void serio_init_port(struct serio *serio)\n {\n -\tinit_MUTEX(&serio->drv_sem);\n +\tmutex_init(&serio->new_lock);\n }\n")) + (shared_brace.res Ok) (signed.res Ok) (sis.res Ok) (sizeof.res Ok) + (sizeof_julia.res Ok) (skip.res Ok) (sp.res Ok) (spaces.res Ok) (spl.res Ok) + (static.res (Pb "PROBLEM\n exn = Common.Impossible\n")) (stm1.res Ok) + (stm10.res Ok) (stm10_ver1.res Ok) (stm2.res Ok) (stm3.res Ok) (stm4.res Ok) + (stm5.res Ok) (stm6.res Ok) (stm7.res Ok) (stm8.res Ok) (stmt.res Ok) + (strangeorder.res Ok) (string.res Ok) (struct.res Ok) + (struct_metavar.res Ok) (struct_typedef.res Ok) (structfoo.res Ok) + (substruct.res Ok) (sw.res Ok) (switch.res Ok) (td.res Ok) (test0.res Ok) + (test1.res Ok) (test10.res Ok) (test10_ver1.res Ok) (test11.res Ok) + (test11_ver1.res Ok) (test12.res Ok) (test2.res Ok) (test3.res Ok) + (test4.res Ok) (test5.res Ok) (test5_ver1.res Ok) (test6.res Ok) + (test7.res Ok) (test8.res Ok) (test9.res Ok) (test_unsigned_meta.res Ok) + (three_types.res Ok) (threea.res Ok) (top.res Ok) (topdec.res Ok) + (topdec_ver1.res Ok) (topdec_ver2.res Ok) (toplevel_macrostmt.res Ok) + (toplevel_struct.res Ok) (tup.res Ok) (twoproto.res Ok) (ty.res Ok) + (ty1.res Ok) (ty_tyexp.res Ok) (type.res Ok) (type1.res Ok) + (type_annotated.res Ok) (type_ver1.res Ok) + (type_ver2.res + (Pb + "INCORRECT:PB parsing only in generated-file\n diff (result(<) vs expected_result(>)) = \n @@ -1,5 +1,5 @@\n int foo() {\n - int[10] *x;\n + int *x[10];\n return 0;\n }\n \n")) + (typedef.res Ok) + (typedef3.res + (Pb + "INCORRECT:diff token: link VS p_dev\nFile , line 7, column 29, charpos = 137\n around = 'link', whole content = \tunsigned int iobase = info->link.io.BasePort1;\nFile \"tests/typedef3.res\", line 7, column 29, charpos = 137\n around = 'p_dev', whole content = \tunsigned int iobase = info->p_dev->io.BasePort1;\n\n diff (result(<) vs expected_result(>)) = \n @@ -4,7 +4,7 @@\n \n static void should_work(foo *info)\n {\n -\tunsigned int iobase = info->link.io.BasePort1;\n +\tunsigned int iobase = info->p_dev->io.BasePort1;\n }\n \n static void does_work(struct bluecard_info_t *info)\n")) + (typedef_double.res Ok) + (typeof.res + (Pb + "INCORRECT:diff token: x VS sizeof\nFile , line 3, column 4, charpos = 26\n around = 'x', whole content = f(x);\nFile \"tests/typeof.res\", line 3, column 4, charpos = 26\n around = 'sizeof', whole content = f(sizeof(struct foo));\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,4 +1,4 @@\n int main() {\n int x;\n - f(x);\n + f(sizeof(struct foo));\n }\n")) + (useless_cast.res Ok) (varargs.res Ok) (video1bis.res Ok) (void.res Ok) + (vpos.res Ok) (whitespace.res Ok) (wierd_argument.res Ok) + (wierdinit.res + (Pb + "seems incorrect, but only because of code that was not parsablediff token: dev_link_t VS struct\nFile \"tests/wierdinit.c\", line 4, column 1, charpos = 27\n around = 'dev_link_t', whole content = \tdev_link_t *link;\nFile \"tests/wierdinit.res\", line 4, column 1, charpos = 27\n around = 'struct', whole content = \tstruct pcmcia_device *link;\n")) + (ws2.res Ok) (xfield.res Ok) (y2.res Ok) (zero.res Ok)) \ No newline at end of file diff --git a/tests/SCORE_expected_orig.sexp b/tests/SCORE_expected_orig.sexp new file mode 100644 index 0000000..f79f8a9 --- /dev/null +++ b/tests/SCORE_expected_orig.sexp @@ -0,0 +1,147 @@ +((a3d.res Ok) (a_and_e.res Ok) (a_and_e_ver1.res Ok) (addelse.res Ok) + (addif.res Ok) (addif1.res Ok) (addif2.res Ok) (after_if.res Ok) + (anon.res Ok) (ar.res Ok) (arg.res Ok) (argument.res Ok) (array_init.res Ok) + (array_size.res Ok) (arraysz.res Ok) (b1.res Ok) (b2.res Ok) + (bad_iso_example.res + (Pb + "INCORRECT:diff token: ( VS x\nFile \"tests/bad_iso_example.c\", line 2, column 6, charpos = 19\n around = '(', whole content = if ((x = 3)) return;\nFile \"tests/bad_iso_example.res\", line 2, column 6, charpos = 19\n around = 'x', whole content = if (x) return;\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,4 +1,4 @@\n int main() {\n - if ((x = 3)) return;\n + if (x) return;\n }\n \n")) + (bad_ptr_print.res Ok) (bad_typedef.res Ok) (badexp.res Ok) + (badpos.res + (Pb + "PROBLEM\n exn = Failure(\"rule starting on line 1: already tagged token:\\nFile \\\"tests/badpos.c\\\", line 5, column 30, charpos = 139\\n around = 'reg_ptr', whole content = \\t (int) -(((struct pt_regs *) reg_ptr)->orig_eax + 2));\")\n")) + (badtypedef.res Ok) (badzero.res Ok) (ben.res Ok) (bitfield.res Ok) + (braces.res Ok) (break.res Ok) (bug1.res Ok) + (bugloop.res + (Pb + "INCORRECT:diff token: PF_FREEZE VS )\nFile , line 12, column 16, charpos = 390\n around = 'PF_FREEZE', whole content = \t\t\trefrigerator(PF_FREEZE);\nFile \"tests/bugloop.res\", line 8, column 16, charpos = 160\n around = ')', whole content = \t\t\trefrigerator();\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,7 +1,3 @@\n -/* this doesn't work, because on the paths where we don't find refrigerator,\n -we expect to reach Exit without first going through current->flags & PF_FREEZE,\n -but of course any path that goes around the loop does precisely that */\n -\n static int stir_transmit_thread(void *arg)\n {\n \n @@ -9,7 +5,7 @@\n \t{\n \t\t/* if suspending, then power off and wait */\n \t\tif (unlikely(freezing(current))) {\n -\t\t\trefrigerator(PF_FREEZE);\n +\t\t\trefrigerator();\n \n \t\t}\n \t}\n")) + (bugon.res Ok) (cards.res Ok) (cast.res Ok) (cast_iso.res Ok) + (compare.res Ok) (const.res Ok) (const1bis.res Ok) (const_adding.res Ok) + (const_array.res Ok) (const_implicit_iso.res Ok) (constty.res Ok) + (constx.res Ok) (cs_check.res Ok) (cst.res Ok) (csw.res Ok) + (dbg.res + (Pb + "INCORRECT:diff token: else VS (\nFile , line 8, column 2, charpos = 133\n around = 'else', whole content = \t\telse pr = NULL;;\nFile \"tests/dbg.res\", line 7, column 5, charpos = 130\n around = '(', whole content = \t\tDBG(\"PCI\");\n\n diff (result(<) vs expected_result(>)) = \n @@ -4,6 +4,6 @@\n \tstruct resource *pr, *r = &dev->resource[idx];\n \n \tif (pr)\n -\t\tDBG\n -\t\telse pr = NULL;;\n +\t\tDBG(\"PCI\");\n +\telse pr = NULL;\n }\n")) + (dc_close.res Ok) (debug.res Ok) (dec.res Ok) (decl.res Ok) (decl2.res Ok) + (decl_space.res Ok) + (decl_split.res + (Pb + "INCORRECT:diff token: int VS }\nFile \"tests/decl_split.c\", line 2, column 8, charpos = 27\n around = 'int', whole content = int x, y;\nFile \"tests/decl_split.res\", line 2, column 0, charpos = 19\n around = '}', whole content = }\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,3 +1,2 @@\n int func(int i) { \n - int x, y;\n }\n")) + (define_exp.res Ok) (define_param.res Ok) (deftodo.res Ok) (deref.res Ok) + (devlink.res Ok) (disjexpr.res Ok) (disjexpr_ver1.res Ok) + (disjexpr_ver2.res Ok) (distribute.res Ok) (double.res Ok) + (double_assign.res Ok) + (double_switch.res (Pb "PROBLEM\n exn = Common.Impossible\n")) + (doublepos.res Ok) + (doubleswitch.res (Pb "PROBLEM\n exn = Common.Impossible\n")) + (dowhile.res Ok) (dropf.res Ok) (dropparam.res Ok) (edots.res Ok) + (edots_ver1.res Ok) (empty.res Ok) (end_commas.res Ok) (endif.res Ok) + (exp.res Ok) (expnest.res Ok) (expopt.res Ok) (expopt2.res Ok) + (expopt3.res Ok) (expopt3_ver1.res Ok) (expopt3_ver2.res Ok) (fields.res Ok) + (fieldsmin.res Ok) (fix_flow_need.res Ok) (fn_todo.res Ok) (fnptr.res Ok) + (fnret.res Ok) (four.res Ok) (foura.res Ok) (fp.res Ok) (fun.res Ok) + (gilles-question.res Ok) (gotobreak.res Ok) (hd.res Ok) (headers.res Ok) + (hex.res Ok) (hil1.res Ok) (if.res Ok) (ifbr.res Ok) (ifdef1.res Ok) + (ifdef2.res Ok) + (ifdef3.res + (Pb + "PROBLEM\n exn = Lexer_cocci.Lexical(\"unrecognised symbol, in token rule: #\")\n")) + (ifdef4.res Ok) (ifdef5.res Ok) (ifdef6.res Ok) (ifdef6a.res Ok) + (ifdefmeta.res Ok) (ifdefmeta1.res Ok) (ifdefmeta2.res Ok) + (ifdefmeta3.res Ok) + (ifdefmeta4.res + (Pb + "PROBLEM\n exn = Unix.Unix_error(20, \"stat\", \"tests/ifdefmeta4.cocci\")\n")) + (ifend.res Ok) (ifzer.res Ok) (inc.res Ok) + (incdir.res + (Pb + "INCORRECT:diff token: x VS 12\nFile \"tests/incdir.c\", line 4, column 6, charpos = 46\n around = 'x', whole content = foo(x);\nFile \"tests/incdir.res\", line 4, column 6, charpos = 46\n around = '12', whole content = foo(12);\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,5 +1,5 @@\n #include \"sub/incdir2.c\"\n \n int main () {\n - foo(x);\n + foo(12);\n }\n")) + (incl.res Ok) (inclifdef.res Ok) (include.res Ok) + (incompatible_value.res Ok) (inherited.res Ok) (inherited_ver1.res Ok) + (inhpos.res Ok) (initializer.res Ok) (initializer_many_fields.res Ok) + (inline.res Ok) (isococci.res Ok) (isotest.res Ok) (isotest2.res Ok) + (iterator.res Ok) + (jloop1.res + (Pb + "PROBLEM\n exn = Failure(\"minus: parse error: \\n = File \\\"tests/jloop1.cocci\\\", line 10, column 3, charpos = 129\\n around = '...>', whole content = ...>\\n\")\n")) + (julia10.res Ok) (julia7.res Ok) (keep_comma.res Ok) (km.res Ok) + (kmalloc.res Ok) (kmc.res Ok) (ktype.res Ok) + (labels_metastatement.res + (Pb + "INCORRECT:diff token: { VS x\nFile , line 4, column 2, charpos = 30\n around = '{', whole content = {\nFile \"tests/labels_metastatement.res\", line 4, column 4, charpos = 32\n around = 'x', whole content = x = 3; foo();\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,15 +1,10 @@\n int foo(int i) {\n \n if(1) {\n - {\n - x = 3;\n - foo();\n - z = 4;\n - foo();\n - }\n - foo();\n - }\n - foo(); // we dont want that it add both foo on the } and on the endif\n + x = 3; foo();\n + z = 4; foo();\n + } // we dont want that it add both foo on the } and on the endif\n // (note: but need correct endif accrochage)\n + foo();\n \n }\n")) + (labels_metastatement_ver1.res Ok) (local.res Ok) (localid.res Ok) + (longlong.res Ok) (longlongint.res Ok) (loop.res Ok) (lvalue.res Ok) + (macro.res Ok) (match_no_meta.res Ok) (max.res Ok) + (metahex.res + (Pb + "INCORRECT:diff token: f VS }\nFile \"tests/metahex.c\", line 2, column 2, charpos = 15\n around = 'f', whole content = f(3);\nFile \"tests/metahex.res\", line 2, column 0, charpos = 13\n around = '}', whole content = }\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,4 +1,2 @@\n int main() {\n - f(3);\n - g(0x03);\n }\n")) + (metaruleelem.res Ok) (metastatement2.res Ok) (metastatement_for.res Ok) + (metastatement_if.res Ok) (minstruct.res Ok) (minusdots.res Ok) + (minusdots_ver1.res Ok) + (multi_func1.res + (Pb + "PROBLEM\n exn = Failure(\"minus: parse error: \\n = File \\\"tests/multi_func1.cocci\\\", line 12, column 2, charpos = 102\\n around = 'fn2', whole content = fn2(...) {\\n\")\n")) + (multiplus.res Ok) (multitype.res Ok) (multitypedef.res Ok) + (multivars.res Ok) (nest.res Ok) (nestone.res Ok) (nestseq.res Ok) + (neststruct.res Ok) (nl.res Ok) (nocast.res Ok) (not.res Ok) (noty.res Ok) + (null_type.res Ok) (of.res Ok) (oneline.res Ok) (opt.res Ok) + (optional_qualifier.res Ok) (optional_storage.res Ok) (orexp.res Ok) + (param.res Ok) (param_end.res Ok) (param_ver1.res Ok) + (parameters_dots.res Ok) (partial.res Ok) + (pb_distribute_type.res + (Pb + "INCORRECT:PB parsing only in generated-file\n diff (result(<) vs expected_result(>)) = \n @@ -5,11 +5,11 @@\n \n \n int foo() {\n - int * *x;\n + int **x;\n return 0;\n }\n \n int foo() {\n - int[45] *x;\n + int (*x)[45];\n return 0;\n }\n")) + (pb_distribute_type2.res + (Pb + "INCORRECT:PB parsing only in generated-file\n diff (result(<) vs expected_result(>)) = \n @@ -1,5 +1,5 @@\n int foo() {\n - int* x;\n + int *x;\n return 0;\n }\n \n @@ -10,6 +10,6 @@\n }\n \n int foo() {\n - int x[45]*;\n + int (*x)[45];\n return 0;\n }\n")) + (pb_distribute_type3.res + (Pb "PROBLEM\n exn = Failure(\"line 7: index 53 53 already used\\n\")\n")) + (pb_distribute_type4.res Ok) (pb_params_iso.res Ok) + (pb_parsing_macro.res Ok) (pb_tag_symbols.res Ok) (pmac.res Ok) + (posiso.res Ok) (positionc.res Ok) (post.res Ok) (print_return.res Ok) + (proto.res Ok) (proto2.res Ok) (proto_ver1.res Ok) (proto_ver2.res Ok) + (protoassert.res Ok) (protox.res Ok) (rcu3.res Ok) + (remstruct.res + (Pb + "INCORRECT:not same number of entities (func, decl, ...)\n diff (result(<) vs expected_result(>)) = \n @@ -1,10 +1,3 @@\n -\n - .ack = mpuio_ack_irq,\n - .mask = mpuio_mask_irq,\n - .unmask = mpuio_unmask_irq\n -\n - .b = 15,\n -\n int hello ( String input )\n {\n String input = input.lowercase();\n")) + (replace_typedef.res Ok) (reserved.res Ok) (retmacro.res Ok) (rets.res Ok) + (return.res Ok) (return_implicit.res Ok) (same_expr.res Ok) + (scope_problem.res + (Pb + "INCORRECT:diff token: } VS a\nFile , line 6, column 2, charpos = 45\n around = '}', whole content = }\nFile \"tests/scope_problem.res\", line 7, column 4, charpos = 49\n around = 'a', whole content = a = 2;\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,8 +1,10 @@\n void main(int i) {\n \n \n +\n if(1) {\n int a;\n + a = 2;\n }\n \n \n")) + (serio.res + (Pb + "INCORRECT:diff token: init_MUTEX VS mutex_init\nFile \"tests/serio.c\", line 7, column 1, charpos = 130\n around = 'init_MUTEX', whole content = \tinit_MUTEX(&serio->drv_sem);\nFile \"tests/serio.res\", line 7, column 1, charpos = 130\n around = 'mutex_init', whole content = \tmutex_init(&serio->new_lock);\n\n diff (result(<) vs expected_result(>)) = \n @@ -4,5 +4,5 @@\n \n static void serio_init_port(struct serio *serio)\n {\n -\tinit_MUTEX(&serio->drv_sem);\n +\tmutex_init(&serio->new_lock);\n }\n")) + (shared_brace.res Ok) (signed.res Ok) (sis.res Ok) (sizeof.res Ok) + (sizeof_julia.res Ok) (skip.res Ok) (sp.res Ok) (spaces.res Ok) (spl.res Ok) + (static.res (Pb "PROBLEM\n exn = Common.Impossible\n")) (stm1.res Ok) + (stm10.res Ok) (stm10_ver1.res Ok) (stm2.res Ok) (stm3.res Ok) (stm4.res Ok) + (stm5.res Ok) (stm6.res Ok) (stm7.res Ok) (stm8.res Ok) (stmt.res Ok) + (strangeorder.res Ok) (string.res Ok) (struct.res Ok) + (struct_metavar.res Ok) (struct_typedef.res Ok) (structfoo.res Ok) + (substruct.res Ok) (sw.res Ok) (switch.res Ok) (td.res Ok) (test0.res Ok) + (test1.res Ok) (test10.res Ok) (test10_ver1.res Ok) (test11.res Ok) + (test11_ver1.res Ok) (test12.res Ok) (test2.res Ok) (test3.res Ok) + (test4.res Ok) (test5.res Ok) (test5_ver1.res Ok) (test6.res Ok) + (test7.res Ok) (test8.res Ok) (test9.res Ok) (test_unsigned_meta.res Ok) + (three_types.res Ok) (threea.res Ok) (top.res Ok) (topdec.res Ok) + (topdec_ver1.res Ok) (topdec_ver2.res Ok) (toplevel_macrostmt.res Ok) + (toplevel_struct.res Ok) (tup.res Ok) (twoproto.res Ok) (ty.res Ok) + (ty1.res Ok) (ty_tyexp.res Ok) (type.res Ok) (type1.res Ok) + (type_annotated.res Ok) (type_ver1.res Ok) + (type_ver2.res + (Pb + "INCORRECT:PB parsing only in generated-file\n diff (result(<) vs expected_result(>)) = \n @@ -1,5 +1,5 @@\n int foo() {\n - int[10] *x;\n + int *x[10];\n return 0;\n }\n \n")) + (typedef.res Ok) + (typedef3.res + (Pb + "INCORRECT:diff token: link VS p_dev\nFile , line 7, column 29, charpos = 137\n around = 'link', whole content = \tunsigned int iobase = info->link.io.BasePort1;\nFile \"tests/typedef3.res\", line 7, column 29, charpos = 137\n around = 'p_dev', whole content = \tunsigned int iobase = info->p_dev->io.BasePort1;\n\n diff (result(<) vs expected_result(>)) = \n @@ -4,7 +4,7 @@\n \n static void should_work(foo *info)\n {\n -\tunsigned int iobase = info->link.io.BasePort1;\n +\tunsigned int iobase = info->p_dev->io.BasePort1;\n }\n \n static void does_work(struct bluecard_info_t *info)\n")) + (typedef_double.res Ok) + (typeof.res + (Pb + "INCORRECT:diff token: x VS sizeof\nFile , line 3, column 4, charpos = 26\n around = 'x', whole content = f(x);\nFile \"tests/typeof.res\", line 3, column 4, charpos = 26\n around = 'sizeof', whole content = f(sizeof(struct foo));\n\n diff (result(<) vs expected_result(>)) = \n @@ -1,4 +1,4 @@\n int main() {\n int x;\n - f(x);\n + f(sizeof(struct foo));\n }\n")) + (useless_cast.res Ok) (varargs.res Ok) (video1bis.res Ok) (void.res Ok) + (vpos.res Ok) (whitespace.res Ok) (wierd_argument.res Ok) + (wierdinit.res + (Pb + "seems incorrect, but only because of code that was not parsablediff token: dev_link_t VS struct\nFile \"tests/wierdinit.c\", line 4, column 1, charpos = 27\n around = 'dev_link_t', whole content = \tdev_link_t *link;\nFile \"tests/wierdinit.res\", line 4, column 1, charpos = 27\n around = 'struct', whole content = \tstruct pcmcia_device *link;\n")) + (ws2.res Ok) (xfield.res Ok) (y2.res Ok) (zero.res Ok)) \ No newline at end of file diff --git a/tests/a_and_e.cocci b/tests/a_and_e.cocci index b3b1e6f..8e0f0d8 100644 --- a/tests/a_and_e.cocci +++ b/tests/a_and_e.cocci @@ -3,6 +3,6 @@ expression X, Y; @@ g(); -+ f(Y,0); ++ f(Y, 0); ... f(X,Y); diff --git a/tests/addif.cocci b/tests/addif.cocci index c9669fc..8cf5d86 100644 --- a/tests/addif.cocci +++ b/tests/addif.cocci @@ -6,7 +6,7 @@ identifier f; + /* some comment */ + int xxx() { + /* a comment by itself */ -+ return 12; /* another comment */ } ++ return 12;/* another comment */ } + #endif int f(...) diff --git a/tests/addif2.cocci b/tests/addif2.cocci index 4a516a5..f455679 100644 --- a/tests/addif2.cocci +++ b/tests/addif2.cocci @@ -3,7 +3,7 @@ identifier f; @@ + #ifdef FOO -+ int /*foo*/ xxx; ++ int/*foo*/ xxx; + #endif int f(...) diff --git a/tests/anon.cocci b/tests/anon.cocci index 61c6d7e..2823208 100644 --- a/tests/anon.cocci +++ b/tests/anon.cocci @@ -15,4 +15,4 @@ identifier is_delayed.fld; @@ - schedule_work(&device->fld) -+ schedule_delayed_work(&device->fld,0) ++ schedule_delayed_work(&device->fld, 0) diff --git a/tests/argument.cocci b/tests/argument.cocci index f323d1f..ae64289 100644 --- a/tests/argument.cocci +++ b/tests/argument.cocci @@ -2,7 +2,7 @@ @@ - f(1,2,3); -+ g(3,2,1); ++ g(3, 2, 1); @@ diff --git a/tests/array_init.cocci b/tests/array_init.cocci index a421069..79f662a 100644 --- a/tests/array_init.cocci +++ b/tests/array_init.cocci @@ -10,6 +10,7 @@ T I[E]; identifier rule3.I; expression str; type rule3.T; +declarer name MODULE_PARM; @@ - MODULE_PARM(I,str); diff --git a/tests/badzero.c b/tests/badzero.c new file mode 100644 index 0000000..884c4a8 --- /dev/null +++ b/tests/badzero.c @@ -0,0 +1,10 @@ +int main () { + int *x; + int *y; + int z; + if (y - x == 0) return; + if ((y - x) == 0) return; + if (y - z == 0) return; + if ((y - z) == 0) return; +} + diff --git a/tests/badzero.cocci b/tests/badzero.cocci new file mode 100644 index 0000000..2f5998b --- /dev/null +++ b/tests/badzero.cocci @@ -0,0 +1,26 @@ +// A pointer should not be compared to NULL +// +// Confidence: High +// Copyright: (C) Gilles Muller, Julia Lawall, EMN, DIKU. GPLv2. +// URL: http://www.emn.fr/x-info/coccinelle/rules/badzero.html +// Options: + +@r disable is_zero,isnt_zero @ +expression *E; +position p; +@@ + +( +- E@p == 0 ++ 27 +| +- E@p != 0 ++ 27 +| +- 0 == E@p ++ 27 +| +- 0 != E@p ++ 27 +) + diff --git a/tests/badzero.res b/tests/badzero.res new file mode 100644 index 0000000..3810782 --- /dev/null +++ b/tests/badzero.res @@ -0,0 +1,10 @@ +int main () { + int *x; + int *y; + int z; + if (y - x == 0) return; + if ((y - x) == 0) return; + if (27) return; + if (27) return; +} + diff --git a/tests/ben.cocci b/tests/ben.cocci index 2689213..7fb6d36 100644 --- a/tests/ben.cocci +++ b/tests/ben.cocci @@ -5,7 +5,7 @@ typedef GType, GTypeInfo; initialiser E ; @@ + static GType this_type = 0; -+ static const GTypeInfo this_info = E ; ++ static const GTypeInfo this_info = E; GType get_type () { - static GType this_type = 0; if (...) { diff --git a/tests/cards.cocci b/tests/cards.cocci index 33a6511..f692c7e 100644 --- a/tests/cards.cocci +++ b/tests/cards.cocci @@ -1,6 +1,7 @@ @@ identifier I; expression str; +declarer name MODULE_PARM; @@ - MODULE_PARM(I,str); diff --git a/tests/cast_iso.cocci b/tests/cast_iso.cocci index f111ec4..246f799 100644 --- a/tests/cast_iso.cocci +++ b/tests/cast_iso.cocci @@ -4,7 +4,7 @@ type T; @@ - snd_magic_cast(T, (void*) B ,...) -+ (T *) B ++ (T *)B @@ expression B; diff --git a/tests/check_order1.c b/tests/check_order1.c new file mode 100644 index 0000000..0453e89 --- /dev/null +++ b/tests/check_order1.c @@ -0,0 +1,7 @@ +int main () { + f(one); + f(two); + f(three); + f(four); + f(five); +} diff --git a/tests/check_order1.cocci b/tests/check_order1.cocci new file mode 100644 index 0000000..8be1027 --- /dev/null +++ b/tests/check_order1.cocci @@ -0,0 +1,11 @@ +@r@ +expression E; +@@ + +f(E); + +@script:python@ +E << r.E; +@@ + +print E diff --git a/tests/check_order2.c b/tests/check_order2.c new file mode 100644 index 0000000..2204f84 --- /dev/null +++ b/tests/check_order2.c @@ -0,0 +1,17 @@ +int main () { + g(five); + g(four); + g(three); + g(two); + g(one); + f(one, 1); + f(two, 2); + f(three, 3); + f(four, 4); + f(five, 5); + f(one, 10); + f(two, 20); + f(three, 30); + f(four, 40); + f(five, 50); +} diff --git a/tests/check_order2.cocci b/tests/check_order2.cocci new file mode 100644 index 0000000..d7df751 --- /dev/null +++ b/tests/check_order2.cocci @@ -0,0 +1,17 @@ +@s@ +expression E; +@@ + +g(E); + +@r@ +expression s.E, E1; +@@ + +f(E,E1); + +@script:python@ +E1 << r.E1; +@@ + +print E1 diff --git a/tests/constx.cocci b/tests/constx.cocci index 2a4db6b..aafed95 100644 --- a/tests/constx.cocci +++ b/tests/constx.cocci @@ -3,5 +3,5 @@ constant X; @@ - foo(X); -+ foobar(X,X); ++ foobar(X, X); diff --git a/tests/cs_check.cocci b/tests/cs_check.cocci index 5393099..20039e6 100644 --- a/tests/cs_check.cocci +++ b/tests/cs_check.cocci @@ -3,4 +3,4 @@ expression E1; @@ - pcmcia_get_first_tuple(handle,E1) -+ pcmcia_get_first_tuple(link,E1) ++ pcmcia_get_first_tuple(link, E1) diff --git a/tests/dropf.cocci b/tests/dropf.cocci index 7920922..66ce982 100644 --- a/tests/dropf.cocci +++ b/tests/dropf.cocci @@ -3,4 +3,4 @@ expression E; @@ - f(E) -+ f(E+3) \ No newline at end of file ++ f(E + 3) \ No newline at end of file diff --git a/tests/find_long.c b/tests/find_long.c new file mode 100644 index 0000000..eb93b3e --- /dev/null +++ b/tests/find_long.c @@ -0,0 +1,10 @@ +long function() +{ + long a; + int b; + + a + b; + b + a; + + return a; +} diff --git a/tests/find_long.cocci b/tests/find_long.cocci new file mode 100644 index 0000000..cfaecb9 --- /dev/null +++ b/tests/find_long.cocci @@ -0,0 +1,11 @@ +@ C @ +long E1; +int E2; +@@ +( +- E1; ++ (long)E1; +| +- E2; ++ (int)E2; +) diff --git a/tests/find_long.res b/tests/find_long.res new file mode 100644 index 0000000..ae5e19c --- /dev/null +++ b/tests/find_long.res @@ -0,0 +1,10 @@ +long function() +{ + long a; + int b; + + (long)a + b; + (long)b + a; + + return a; +} diff --git a/tests/fun.cocci b/tests/fun.cocci index ff40f23..8e07ff8 100644 --- a/tests/fun.cocci +++ b/tests/fun.cocci @@ -1,5 +1,5 @@ @@ @@ -+struct a {int a;}; ++struct a{int a;}; f(int x) { return x; } diff --git a/tests/hd.cocci b/tests/hd.cocci index 2552846..6dedccf 100644 --- a/tests/hd.cocci +++ b/tests/hd.cocci @@ -2,6 +2,6 @@ @@ - f(int x, int y) { -+ f(int x) { ++ f(int x){ ... } diff --git a/tests/headers.cocci b/tests/headers.cocci index 3145594..5bff2c7 100644 --- a/tests/headers.cocci +++ b/tests/headers.cocci @@ -8,8 +8,8 @@ usb_fill_bulk_urb(f) identifier p1, p2; @@ -- void f (struct urb *p1, struct pt_regs *p2) -+ void f (struct urb *p1) +- void f(struct urb *p1, struct pt_regs *p2) ++ void f(struct urb *p1) { ... when != p2 } diff --git a/tests/ifdef4.cocci b/tests/ifdef4.cocci index b79c9ea..57d6263 100644 --- a/tests/ifdef4.cocci +++ b/tests/ifdef4.cocci @@ -4,7 +4,7 @@ { <... + #ifdef CONFIG_NKERNEL -+ if (irq < IRQ_LIMIT) ++ if(irq < IRQ_LIMIT) + #endif *desc = irq_desc; ...> diff --git a/tests/ifdef5.cocci b/tests/ifdef5.cocci index 644afa5..accf3ef 100644 --- a/tests/ifdef5.cocci +++ b/tests/ifdef5.cocci @@ -4,7 +4,7 @@ + #ifdef CONFIG_NKERNEL + #ifndef TIMER_32K_SYNCHRONIZED -+ #define TIMER_32K_SYNCHRONIZED 0xffffffff ++ #define TIMER_32K_SYNCHRONIZED 0xffffffff + #endif + unsigned long nk_vtick_read_stamp(void) diff --git a/tests/ifdefmeta.c b/tests/ifdefmeta.c new file mode 100644 index 0000000..f8bca7e --- /dev/null +++ b/tests/ifdefmeta.c @@ -0,0 +1,49 @@ +int main() { + buf = alloca(3 + #ifdef PLATFORM_A +// platform a stuff + +5 + +50 + #endif + #ifdef PLATFORM_B +/* platform b stuff */ + +2 + #endif + ); + buf = alloca(3 + #ifdef PLATFORM_A +// platform a stuff + +5 + +50 + #endif + #ifdef PLATFORM_B +/* platform b stuff */ + +2 + #endif + ); +} + +int other() { + buf = alloca(3 + #ifdef PLATFORM_A +// platform a stuff + +5 + #endif + #ifdef PLATFORM_B +/* platform b stuff */ + +2 + #endif + ); + buf = alloca(3 + +5 + +2 + ); +} + +int third() { + buf = alloca(3+5+2); + buf = alloca(3 + +5 + +2 + ); +} diff --git a/tests/ifdefmeta.cocci b/tests/ifdefmeta.cocci new file mode 100644 index 0000000..0841c09 --- /dev/null +++ b/tests/ifdefmeta.cocci @@ -0,0 +1,7 @@ +@@ expression E; @@ + +-alloca(E) ++malloc(E) + ... +-alloca(E) ++malloc(E) diff --git a/tests/ifdefmeta.res b/tests/ifdefmeta.res new file mode 100644 index 0000000..2fb4fc8 --- /dev/null +++ b/tests/ifdefmeta.res @@ -0,0 +1,42 @@ +int main() { + buf = malloc(3 +#ifdef PLATFORM_A + + 5 + 50 +#endif + +#ifdef PLATFORM_B + + 2 +#endif +); + buf = malloc(3 +#ifdef PLATFORM_A + + 5 + 50 +#endif + +#ifdef PLATFORM_B + + 2 +#endif +); +} + +int other() { + buf = alloca(3 + #ifdef PLATFORM_A +// platform a stuff + +5 + #endif + #ifdef PLATFORM_B +/* platform b stuff */ + +2 + #endif + ); + buf = alloca(3 + +5 + +2 + ); +} + +int third() { + buf = malloc(3 + 5 + 2); + buf = malloc(3 + 5 + 2); +} diff --git a/tests/ifdefmeta1.c b/tests/ifdefmeta1.c new file mode 100644 index 0000000..a82ceab --- /dev/null +++ b/tests/ifdefmeta1.c @@ -0,0 +1,17 @@ +int main() { + buf = alloca(3 + #ifdef PLATFORM_A +// platform a stuff + + + +5 + + + + #endif + #ifdef PLATFORM_B +/* platform b stuff */ + +2 + #endif + ); +} diff --git a/tests/ifdefmeta1.cocci b/tests/ifdefmeta1.cocci new file mode 100644 index 0000000..c04e29d --- /dev/null +++ b/tests/ifdefmeta1.cocci @@ -0,0 +1,3 @@ +@@ expression E,E1; @@ + +-E1=alloca(E); diff --git a/tests/ifdefmeta1.res b/tests/ifdefmeta1.res new file mode 100644 index 0000000..b2f9976 --- /dev/null +++ b/tests/ifdefmeta1.res @@ -0,0 +1,2 @@ +int main() { +} diff --git a/tests/ifdefmeta2.c b/tests/ifdefmeta2.c new file mode 100644 index 0000000..9950d90 --- /dev/null +++ b/tests/ifdefmeta2.c @@ -0,0 +1,12 @@ +int main() { + buf = alloca(3 + + + +5 + + + + + +2 + ); +} diff --git a/tests/ifdefmeta2.cocci b/tests/ifdefmeta2.cocci new file mode 100644 index 0000000..c04e29d --- /dev/null +++ b/tests/ifdefmeta2.cocci @@ -0,0 +1,3 @@ +@@ expression E,E1; @@ + +-E1=alloca(E); diff --git a/tests/ifdefmeta2.res b/tests/ifdefmeta2.res new file mode 100644 index 0000000..b2f9976 --- /dev/null +++ b/tests/ifdefmeta2.res @@ -0,0 +1,2 @@ +int main() { +} diff --git a/tests/ifdefmeta3.c b/tests/ifdefmeta3.c new file mode 100644 index 0000000..6c40d0b --- /dev/null +++ b/tests/ifdefmeta3.c @@ -0,0 +1,11 @@ +int main () { + f(); + if (foo) { + one(); +#ifdef ONE + two(); +#endif + three(); + } + g(); +} diff --git a/tests/ifdefmeta3.cocci b/tests/ifdefmeta3.cocci new file mode 100644 index 0000000..b3b7e00 --- /dev/null +++ b/tests/ifdefmeta3.cocci @@ -0,0 +1,8 @@ +@@ +statement S; +@@ + + f(); +- S ++ xxx(); + g(); diff --git a/tests/ifdefmeta3.res b/tests/ifdefmeta3.res new file mode 100644 index 0000000..d470bd0 --- /dev/null +++ b/tests/ifdefmeta3.res @@ -0,0 +1,5 @@ +int main () { + f(); + xxx(); + g(); +} diff --git a/tests/ifdefmeta4.res b/tests/ifdefmeta4.res new file mode 100644 index 0000000..b63949d --- /dev/null +++ b/tests/ifdefmeta4.res @@ -0,0 +1,3 @@ +int main () { + // a comment +} diff --git a/tests/ifelse.c b/tests/ifelse.c new file mode 100644 index 0000000..b6745d8 --- /dev/null +++ b/tests/ifelse.c @@ -0,0 +1,52 @@ + +int f(void) +{ +if (x1) + w++; +else if (y1) + z--; +else if (z1) + a--; + +if (x2) + w++; +else if (y2) + z--; + +if (x3) + { + w++; + } +else if (y3) + { + z--; + } + +if (x4) + w++; +else if (y4) + z--; +else if (z4) + a--; +else if (a4) + a--; +} + + +function if_if(void) +{ +if (x4) + w++; +if (y4) + z--; + +dummy--; + +if (x5) + w++; +A++; +if (y5) + z--; + +} + diff --git a/tests/ifelse.cocci b/tests/ifelse.cocci new file mode 100644 index 0000000..72fa7de --- /dev/null +++ b/tests/ifelse.cocci @@ -0,0 +1,93 @@ +@ if_else_3 @ +position p_3_1, p_3_2; +expression E_3_1, E_3_2, E_3_3, E_3_4; +statement S_3_1, S_3_2, S_3_3, S_3_4; +@@ +if (E_3_1) + S_3_1 +else if (E_3_2) + S_3_2 +else if@p_3_1 (E_3_3) + S_3_3 +else if@p_3_2 (E_3_4) + S_3_4 +// + foo_3(); + +@ + +script:python @ expr_1 << if_else_3.E_3_1; + expr_2 << if_else_3.E_3_2; + expr_3 << if_else_3.E_3_3; + expr_4 << if_else_3.E_3_4; + @@ +print "--- 4" +print expr_1 +print expr_2 +print expr_3 +print expr_4 + +@ if_else_2 @ +position p_2 != if_else_3.p_3_2; +expression E_2_1, E_2_2, E_2_3; +statement S_2_1, S_2_2, S_2_3; +@@ +if (E_2_1) + S_2_1 +else if (E_2_2) + S_2_2 +else if@p_2 (E_2_3) + S_2_3 +// + foo_2(); + +@ + +script:python @ expr_1 << if_else_2.E_2_1; + expr_2 << if_else_2.E_2_2; + expr_3 << if_else_2.E_2_3; + @@ +print "--- 3" +print expr_1 +print expr_2 +print expr_3 + +@ if_else_1 @ +// @@ +// position p1; +expression E_1_1, E_1_2; +statement S_1_1, S_1_2; +position p_1_1 != if_else_3.p_3_1; +position p_1_2 != if_else_2.p_2; +@@ +if@p_1_1 (E_1_1) + S_1_1 +else if@p_1_2 (E_1_2) + S_1_2 +// + foo_1(); + +@ + +script:python @ expr_1 << if_else_1.E_1_1; + expr_2 << if_else_1.E_1_2; + @@ +print "--- 2" +print expr_1 +print expr_2 + +@ if_if_1 @ +expression E_10_1, E_10_2; +statement S_10_1, S_10_2; +@@ +if (E_10_1) + S_10_1 +if (E_10_2) + S_10_2 +// + bar(); +@ + +script:python @ expr_1 << if_if_1.E_10_1; + expr_2 << if_if_1.E_10_2; + @@ +print "- 2" +print expr_1 +print expr_2 + diff --git a/tests/km.cocci b/tests/km.cocci index 6153aa7..12414ac 100644 --- a/tests/km.cocci +++ b/tests/km.cocci @@ -5,7 +5,7 @@ expression E1,E2; @@ - x = (T)kmalloc(E1,E2) -+ x = kzalloc(E1,E2) ++ x = kzalloc(E1, E2) ... ( - memset((T2)x,0,E1); diff --git a/tests/km.res b/tests/km.res index 8f0c941..6719e0f 100644 --- a/tests/km.res +++ b/tests/km.res @@ -1,5 +1,4 @@ int main() { int *data = kzalloc(element->string.length + 1, GFP_KERNEL); foo(); - memset(data, 0, element->string.length + 1); } diff --git a/tests/kmalloc.cocci b/tests/kmalloc.cocci index a2504ef..208e3d4 100644 --- a/tests/kmalloc.cocci +++ b/tests/kmalloc.cocci @@ -6,6 +6,6 @@ type T; x = - (T)kmalloc(E1,E2) -+ kzalloc(E1,E2) ++ kzalloc(E1, E2) ... - memset(x,0,E1); \ No newline at end of file diff --git a/tests/ktype.cocci b/tests/ktype.cocci index b08e687..d8981e4 100644 --- a/tests/ktype.cocci +++ b/tests/ktype.cocci @@ -7,6 +7,6 @@ expression E2; @@ - x = kmalloc(sizeof(T1),E2) -+ x = kzalloc(sizeof(T1),E2) ++ x = kzalloc(sizeof(T1), E2) ... - memset(x,0,sizeof(*y)); diff --git a/tests/ldecl.c b/tests/ldecl.c new file mode 100644 index 0000000..0ab3704 --- /dev/null +++ b/tests/ldecl.c @@ -0,0 +1,5 @@ + int main(){ + int a, b; + int c = a + b; + return 0; +} diff --git a/tests/ldecl.cocci b/tests/ldecl.cocci new file mode 100644 index 0000000..08ea55d --- /dev/null +++ b/tests/ldecl.cocci @@ -0,0 +1,7 @@ +@test@ +int E1, E2; +int E3; +@@ + E3 = +- E1 + E2 ++ E1 - E2 diff --git a/tests/longconst.c b/tests/longconst.c new file mode 100644 index 0000000..bcf3dc5 --- /dev/null +++ b/tests/longconst.c @@ -0,0 +1,19 @@ +long function1() +{ + long a; + int b; + a = 1l << b; + a = 1u << b; + a = 65536l << b; + a = 65536u << b; + a = 65536 << b; + a = 4294967296 << b; + a = 65535 << b; + a = 4294967295 << b; + a = 0x7fffffff << b; + a = 0x1fl << b; + a = 0x1fu << b; + a = 0x1FL << b; + a = 0x1FU << b; + return a; +} diff --git a/tests/longconst.cocci b/tests/longconst.cocci new file mode 100644 index 0000000..6135fba --- /dev/null +++ b/tests/longconst.cocci @@ -0,0 +1,31 @@ +@@ +expression E; +long E1; +int E2; +@@ +- E1 = E2 << E; ++ E1 = f(E2, "int"); + +@@ +expression E; +long E1; +unsigned int E2; +@@ +- E1 = E2 << E; ++ E1 = f(E2, "unsigned"); + +@@ +expression E; +long E1; +long E2; +@@ +- E1 = E2 << E; ++ E1 = f(E2, "long"); + +@@ +expression E; +long E1; +unsigned long E2; +@@ +- E1 = E2 << E; ++ E1 = f(E2, "unsigned long"); diff --git a/tests/longconst.res b/tests/longconst.res new file mode 100644 index 0000000..04a2126 --- /dev/null +++ b/tests/longconst.res @@ -0,0 +1,19 @@ +long function1() +{ + long a; + int b; + a = f(1l, "long"); + a = f(1u, "unsigned"); + a = f(65536l, "long"); + a = f(65536u, "unsigned"); + a = f(65536, "int"); + a = f(4294967296, "int"); + a = f(65535, "int"); + a = f(4294967295, "int"); + a = f(0x7fffffff, "int"); + a = f(0x1fl, "long"); + a = f(0x1fu, "unsigned"); + a = f(0x1FL, "long"); + a = f(0x1FU, "unsigned"); + return a; +} diff --git a/tests/macro_int16.c b/tests/macro_int16.c new file mode 100644 index 0000000..85a43f3 --- /dev/null +++ b/tests/macro_int16.c @@ -0,0 +1,9 @@ +#define INT16 int +//typedef int INT16; + +void main(void) +{ + INT16 a, b, c; + c = a + b; +} + diff --git a/tests/macro_int16.cocci b/tests/macro_int16.cocci new file mode 100644 index 0000000..fd9aeff --- /dev/null +++ b/tests/macro_int16.cocci @@ -0,0 +1,5 @@ +@testint16@ +int E1, E2, E3; +@@ +- E1 = E2 + E3; ++E1 = E2 - E3; diff --git a/tests/macro_int16.res b/tests/macro_int16.res new file mode 100644 index 0000000..ded0150 --- /dev/null +++ b/tests/macro_int16.res @@ -0,0 +1,9 @@ +#define INT16 int +//typedef int INT16; + +void main(void) +{ + INT16 a, b, c; + c = b - a; +} + diff --git a/tests/metaruleelem.cocci b/tests/metaruleelem.cocci index bbe7da8..00dcdd9 100644 --- a/tests/metaruleelem.cocci +++ b/tests/metaruleelem.cocci @@ -4,4 +4,4 @@ statement S; f(); - S -+ foo(); S ++ foo();S diff --git a/tests/multitype.cocci b/tests/multitype.cocci index c26462c..91bca0d 100644 --- a/tests/multitype.cocci +++ b/tests/multitype.cocci @@ -11,4 +11,4 @@ rule1.T *E; @@ - g(E) -+ g(E,NULL) ++ g(E, NULL) diff --git a/tests/neststruct.cocci b/tests/neststruct.cocci index 1ad529b..900131e 100644 --- a/tests/neststruct.cocci +++ b/tests/neststruct.cocci @@ -5,4 +5,4 @@ expression E,E2; @@ - x = kmalloc(sizeof(E),E2) -+ x = kzalloc(sizeof(E),E2) ++ x = kzalloc(sizeof(E), E2) diff --git a/tests/oddifdef.c b/tests/oddifdef.c new file mode 100644 index 0000000..1a21d98 --- /dev/null +++ b/tests/oddifdef.c @@ -0,0 +1,44 @@ +void one () { + if (errno != ENOENT +#ifdef ENOTDIR + && errno != ENOTDIR +#endif + ) + a = 5; + +#ifdef FOO + x = 0; +#else + x = 0; +#endif +} + +void two() { +#ifdef ENOTTY + if (errno == ENOTTY) + is_a_tty=0; + else +#endif + a = 3; + +#ifdef FOO + x = 0; +#else + x = 0; +#endif +} + +void three() { + if (x) + a = 3; +#ifndef OPENSSL_NO_SSL2 + else if (strcmp(*argv,"-ssl2") == 0) + meth=SSLv2_client_method(); +#endif + +#ifdef FOO + x = 0; +#else + x = 0; +#endif +} diff --git a/tests/oddifdef.cocci b/tests/oddifdef.cocci new file mode 100644 index 0000000..19bf658 --- /dev/null +++ b/tests/oddifdef.cocci @@ -0,0 +1,6 @@ +@@ +@@ + +- x = 0; + ... +- x = 0; diff --git a/tests/oddifdef.res b/tests/oddifdef.res new file mode 100644 index 0000000..1a21d98 --- /dev/null +++ b/tests/oddifdef.res @@ -0,0 +1,44 @@ +void one () { + if (errno != ENOENT +#ifdef ENOTDIR + && errno != ENOTDIR +#endif + ) + a = 5; + +#ifdef FOO + x = 0; +#else + x = 0; +#endif +} + +void two() { +#ifdef ENOTTY + if (errno == ENOTTY) + is_a_tty=0; + else +#endif + a = 3; + +#ifdef FOO + x = 0; +#else + x = 0; +#endif +} + +void three() { + if (x) + a = 3; +#ifndef OPENSSL_NO_SSL2 + else if (strcmp(*argv,"-ssl2") == 0) + meth=SSLv2_client_method(); +#endif + +#ifdef FOO + x = 0; +#else + x = 0; +#endif +} diff --git a/tests/parse_field.c b/tests/parse_field.c new file mode 100644 index 0000000..e5fdeb4 --- /dev/null +++ b/tests/parse_field.c @@ -0,0 +1,4 @@ +void blk_queue_prep_rq(struct request_queue *q, prep_rq_fn *pfn) +{ + q->prep_rq_fn = pfn; +} diff --git a/tests/parsing_pad.c b/tests/parsing_pad.c new file mode 100644 index 0000000..c84edf9 --- /dev/null +++ b/tests/parsing_pad.c @@ -0,0 +1,14 @@ +#ifdef SIGALRM +#if defined(__STDC__) || defined(sgi) || defined(_AIX) +#define SIGRETTYPE void* +#else +#define SIGRETTYPE int* +#endif + + +SIGRETTYPE foo(void) +{ + void x; + + int x$y; +} diff --git a/tests/parsing_pad.cocci b/tests/parsing_pad.cocci new file mode 100644 index 0000000..9b8929c --- /dev/null +++ b/tests/parsing_pad.cocci @@ -0,0 +1,8 @@ +@@ +identifier x; +@@ + +//- void* x; +//+ int* x; +- void* ++ int* diff --git a/tests/protoassert.cocci b/tests/protoassert.cocci index 9d87696..2da3b7d 100644 --- a/tests/protoassert.cocci +++ b/tests/protoassert.cocci @@ -2,7 +2,7 @@ @@ + static struct pcmcia_driver ZZZ_driver = { -+ .owner = THIS_MODULE, ++ .owner = THIS_MODULE, + }; int init (...) { diff --git a/tests/rcu3.cocci b/tests/rcu3.cocci index 069b5aa..49b70cf 100644 --- a/tests/rcu3.cocci +++ b/tests/rcu3.cocci @@ -5,4 +5,4 @@ expression E2; @@ - list_entry(I,T,E2) -+ list_entry(_X(I),T,E2) ++ list_entry(_X(I), T, E2) diff --git a/tests/slow.c b/tests/slow.c new file mode 100644 index 0000000..d762cbc --- /dev/null +++ b/tests/slow.c @@ -0,0 +1,57 @@ +qboolean SV_ReadClientMessage (void) +{ + int ret; + int cmd; + char *s; + + if (host_client->privileged) + ret = 2; + else + ret = 0; + if (Q_strncasecmp(s, "status", 6) == 0) + ret = 1; + else if (Q_strncasecmp(s, "god", 3) == 0) + ret = 1; + else if (Q_strncasecmp(s, "notarget", 8) == 0) + ret = 1; + else if (Q_strncasecmp(s, "fly", 3) == 0) + ret = 1; + else if (Q_strncasecmp(s, "name", 4) == 0) + ret = 1; + else if (Q_strncasecmp(s, "noclip", 6) == 0) + ret = 1; + else if (Q_strncasecmp(s, "say", 3) == 0) + ret = 1; + else if (Q_strncasecmp(s, "say_team", 8) == 0) + ret = 1; + else if (Q_strncasecmp(s, "tell", 4) == 0) + ret = 1; + else if (Q_strncasecmp(s, "color", 5) == 0) + ret = 1; + else if (Q_strncasecmp(s, "kill", 4) == 0) + ret = 1; + else if (Q_strncasecmp(s, "pause", 5) == 0) + ret = 1; + else if (Q_strncasecmp(s, "spawn", 5) == 0) + ret = 1; + else if (Q_strncasecmp(s, "begin", 5) == 0) + ret = 1; + else if (Q_strncasecmp(s, "prespawn", 8) == 0) + ret = 1; + else if (Q_strncasecmp(s, "kick", 4) == 0) + ret = 1; + else if (Q_strncasecmp(s, "ping", 4) == 0) + ret = 1; + else if (Q_strncasecmp(s, "give", 4) == 0) + ret = 1; + else if (Q_strncasecmp(s, "ban", 3) == 0) + ret = 1; + if (ret == 2) + Cbuf_InsertText (s); + else if (ret == 1) + Cmd_ExecuteString (s, src_client); + else + Con_DPrintf("%s tried to %s\n", host_client->name, s); + +} + diff --git a/tests/stm8.cocci b/tests/stm8.cocci index 6d657c6..85094c5 100644 --- a/tests/stm8.cocci +++ b/tests/stm8.cocci @@ -4,4 +4,4 @@ statement S; f(); - S -+ g(); S ++ g();S diff --git a/tests/struct_typedef.cocci b/tests/struct_typedef.cocci index b7dd005..5ce3772 100644 --- a/tests/struct_typedef.cocci +++ b/tests/struct_typedef.cocci @@ -2,7 +2,7 @@ @@ - struct dvb_frontend { -+ struct dvb2_frontend { ++ struct dvb2_frontend{ ... - struct dvb_frontend_ops* ops; + struct dvb_frontend_ops ops; diff --git a/tests/test1.cocci b/tests/test1.cocci index 43f0d29..ce67f96 100644 --- a/tests/test1.cocci +++ b/tests/test1.cocci @@ -6,4 +6,4 @@ expression X,Y,Z; g(Z); ... - h(Y); -+ h(X,Y,Z); ++ h(X, Y, Z); diff --git a/tests/test10.cocci b/tests/test10.cocci index 3c4352f..e9c3b47 100644 --- a/tests/test10.cocci +++ b/tests/test10.cocci @@ -7,5 +7,5 @@ expression X; g(X) ... - h(X) -+ h(X,X) ++ h(X, X) \ No newline at end of file diff --git a/tests/test11.cocci b/tests/test11.cocci index 3c4352f..e9c3b47 100644 --- a/tests/test11.cocci +++ b/tests/test11.cocci @@ -7,5 +7,5 @@ expression X; g(X) ... - h(X) -+ h(X,X) ++ h(X, X) \ No newline at end of file diff --git a/tests/test12.cocci b/tests/test12.cocci index 8ecfec2..7d24f4d 100644 --- a/tests/test12.cocci +++ b/tests/test12.cocci @@ -3,6 +3,6 @@ expression X, Y; @@ - f(X) -+ f(X,Y) ++ f(X, Y) ... g(Y) diff --git a/tests/test3.cocci b/tests/test3.cocci index 30008ce..1220a9f 100644 --- a/tests/test3.cocci +++ b/tests/test3.cocci @@ -4,6 +4,6 @@ expression X,Y; f(X); ... - g(Y); -+ h(X,Y); ++ h(X, Y); //error words = [f] \ No newline at end of file diff --git a/tests/test6.cocci b/tests/test6.cocci index caf6245..85f3958 100644 --- a/tests/test6.cocci +++ b/tests/test6.cocci @@ -3,6 +3,6 @@ expression X; @@ - f(X) -+ f(X,"foo") ++ f(X, "foo") //error words = [f] \ No newline at end of file diff --git a/tests/test7.cocci b/tests/test7.cocci index e9ebdd3..7ba694c 100644 --- a/tests/test7.cocci +++ b/tests/test7.cocci @@ -3,5 +3,5 @@ expression X; @@ - f(X); -+ f(X,"foo"); -+ f(X,"bar"); ++ f(X, "foo"); ++ f(X, "bar"); diff --git a/tests/test9.cocci b/tests/test9.cocci index efdeb3c..dae02c9 100644 --- a/tests/test9.cocci +++ b/tests/test9.cocci @@ -8,6 +8,6 @@ expression X,Y; f(X); ... - h(Y); -+ h(X,Y); ++ h(X, Y); ... } diff --git a/tests/top.cocci b/tests/top.cocci index f10ae48..9b073c1 100644 --- a/tests/top.cocci +++ b/tests/top.cocci @@ -1,4 +1,5 @@ @@ +declarer name MODULE_PARM; @@ - MODULE_PARM(...); diff --git a/tests/toplevel_macrostmt.cocci b/tests/toplevel_macrostmt.cocci index 2ca4ce1..311745d 100644 --- a/tests/toplevel_macrostmt.cocci +++ b/tests/toplevel_macrostmt.cocci @@ -1,11 +1,9 @@ -// better perhaps to use a -// declaration MODULE_PARM; -// declaration module_parm; -// ? @@ expression x,y; +declarer name MODULE_PARM; +declarer name module_param; @@ - MODULE_PARM(x,y); -+ module_param(x,int,y); ++ module_param(x, int, y); diff --git a/tests/whitespace.cocci b/tests/whitespace.cocci index 6308e60..ead69ce 100644 --- a/tests/whitespace.cocci +++ b/tests/whitespace.cocci @@ -3,4 +3,4 @@ expression E; @@ - foo(E); -+ foo(E,12); ++ foo(E, 12); diff --git a/tests/xfield.c b/tests/xfield.c new file mode 100644 index 0000000..2db596e --- /dev/null +++ b/tests/xfield.c @@ -0,0 +1,10 @@ +FOO(a2,b2,c2); + +/* +int y; + +struct foo { + FOO(a,b,c); + FOO(a1,b1,c1); +}; +*/ diff --git a/tests/xfield.cocci b/tests/xfield.cocci new file mode 100644 index 0000000..f26e081 --- /dev/null +++ b/tests/xfield.cocci @@ -0,0 +1,7 @@ +@@ +declarer name FOO; +expression a,b,c; +@@ + +- FOO(a,b,c); ++ int x; diff --git a/tests/xfield.res b/tests/xfield.res new file mode 100644 index 0000000..f7d35ad --- /dev/null +++ b/tests/xfield.res @@ -0,0 +1,10 @@ +int x; + +/* +int y; + +struct foo { + FOO(a,b,c); + FOO(a1,b1,c1); +}; +*/ -- 2.20.1