diff options
author | Edwin Vane <edwin.vane@intel.com> | 2013-02-19 19:14:45 +0000 |
---|---|---|
committer | Edwin Vane <edwin.vane@intel.com> | 2013-02-19 19:14:45 +0000 |
commit | d978130189408328e1db102cf94ee6ec96d51148 (patch) | |
tree | f9c913171c86d8914800dd85f96a54d15ba0c91f /test | |
parent | 08085afd91bd0132dbf8a64ee8b22609af9edcfe (diff) |
Adding files left out of commit r175544.
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@175545 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/cpp11-migrate/CMakeLists.txt | 59 | ||||
-rw-r--r-- | test/cpp11-migrate/Makefile | 66 | ||||
-rw-r--r-- | test/cpp11-migrate/UseAuto/Inputs/gen_my_std.h.py | 98 | ||||
-rw-r--r-- | test/cpp11-migrate/UseAuto/gen_basic_std_iterator_tests.cpp.py | 55 |
4 files changed, 278 insertions, 0 deletions
diff --git a/test/cpp11-migrate/CMakeLists.txt b/test/cpp11-migrate/CMakeLists.txt new file mode 100644 index 00000000..6a7d446e --- /dev/null +++ b/test/cpp11-migrate/CMakeLists.txt @@ -0,0 +1,59 @@ + +# List of generator scripts. Generator scripts must: +# * Be written in python +# * Output their result to standard out. +# * Be named as gen_X.py where X will be the name of the auto-generated file. +set(generator_scripts + UseAuto/gen_basic_std_iterator_tests.cpp.py + UseAuto/Inputs/gen_my_std.h.py + ) + +# macro that runs a generator script to produce an auto-generated file. +# Generator scripts must follow scheme above. The resulting file is placed in: +# ${CMAKE_CURRENT_BINARY_DIR})/autogen/dirname(<script name>). +# +# Two arguments are required: +# script - The generator script (relative to ${CMAKE_CURRENT_SOURCE_DIR}) +# output - Name of the variable to store the name of the generated file in. +macro(autogenerate_file script output) + get_filename_component(dir ${script} PATH) + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/autogen/${dir}") + string(REGEX REPLACE "gen_(.*).py" "\\1" output_name ${script}) + set(script_file + "${CMAKE_CURRENT_SOURCE_DIR}/${script}" + ) + set(output_file + "${CMAKE_CURRENT_BINARY_DIR}/autogen/${output_name}" + ) + set(gencmd + ${PYTHON_EXECUTABLE} + ${script_file} > ${output_file} + ) + add_custom_command( + OUTPUT ${output_file} + COMMAND ${gencmd} + DEPENDS ${script_file} + ) + set(${output} ${output_file}) +endmacro(autogenerate_file) + +# Define rules to run generator scripts. +set(depends) +foreach(script ${generator_scripts}) + autogenerate_file(${script} output) + list(APPEND depends ${output}) +endforeach() + +# This custom target will be used by parent CMakeLists.txt to ensure all +# auto-generated files are created before lit is run. +add_custom_target(cpp11-migrate-autogen + DEPENDS ${depends} + ) + +set(TEST_SOURCE_ROOT ${CMAKE_CURRENT_BINARY_DIR}/autogen) +set(TEST_EXEC_ROOT ${CMAKE_CURRENT_BINARY_DIR}) +set(TESTSUITE_NAME "cpp11-migrate Auto-Generated Tests") +configure_lit_site_cfg( + ${CMAKE_CURRENT_SOURCE_DIR}/../lit.site.cfg.in + ${CMAKE_CURRENT_BINARY_DIR}/autogen/lit.site.cfg + ) diff --git a/test/cpp11-migrate/Makefile b/test/cpp11-migrate/Makefile new file mode 100644 index 00000000..b99027c2 --- /dev/null +++ b/test/cpp11-migrate/Makefile @@ -0,0 +1,66 @@ +##===- tools/extra/test/cpp11-migrate/Makefile -------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +# This Makefile is responsible for creating a LIT testsuite for auto-generated +# tests. The recipe that runs llvm-lit needs to provide the following path of +# the lit.site.cfg for the generated testsuite: $(PROJ_OBJ_DIR)/autogen. + +CLANG_LEVEL := ../../../.. +include $(CLANG_LEVEL)/Makefile + +# List of generator scripts. Generator scripts must: +# * Be written in python +# * Output their result to standard out. +# * Be named as gen_X.py where X will be the name of the auto-generated file. +GENERATOR_SCRIPTS := \ + UseAuto/gen_basic_std_iterator_tests.cpp.py \ + UseAuto/Inputs/gen_my_std.h.py + + +# macro to be used with $(call) that generates a rule and recipe that causes a +# file to be auto-generated from a generator script. Generator scripts must +# follow scheme above. The resulting file is placed in: +# $(PROJ_OBJ_DIR)/autogen/$(dir <script name>). +# +# One argument required: the name of generator script relative to +# $(PROJ_SRC_DIR). +define autogenerate-file +OUTFILE := $(addprefix autogen/$(dir $1), $(patsubst gen_%.py,%,$(notdir $1))) +GENERATED_FILES := $$(GENERATED_FILES) $$(OUTFILE) +$$(OUTFILE): $1 + @echo "Autogenerating $$<" + @$(MKDIR) $(addprefix autogen/, $(dir $1)) + @$(PYTHON) $$< > $$@ +endef +$(foreach script, $(GENERATOR_SCRIPTS), $(eval $(call autogenerate-file,$(script)))) + +FORCE: + +autogen/lit.site.cfg: FORCE + @$(MKDIR) $(PROJ_OBJ_DIR)/autogen + @echo "Making cpp11-migrate Auto-Generated Tests' 'lit.site.cfg' file..." + @$(ECHOPATH) s=@LLVM_SOURCE_DIR@=$(LLVM_SRC_ROOT)=g > lit.tmp + @$(ECHOPATH) s=@LLVM_BINARY_DIR@=$(LLVM_OBJ_ROOT)=g >> lit.tmp + @$(ECHOPATH) s=@LLVM_TOOLS_DIR@=$(ToolDir)=g >> lit.tmp + @$(ECHOPATH) s=@LLVM_LIBS_DIR@=$(LibDir)=g >> lit.tmp + @$(ECHOPATH) s=@CLANG_TOOLS_SOURCE_DIR@=$(PROJ_SRC_DIR)/../..=g >> lit.tmp + @$(ECHOPATH) s=@CLANG_TOOLS_BINARY_DIR@=$(PROJ_OBJ_DIR)/../..=g >> lit.tmp + @$(ECHOPATH) s=@TARGET_TRIPLE@=$(TARGET_TRIPLE)=g >> lit.tmp + @$(ECHOPATH) s=@TEST_SOURCE_ROOT@=$(PROJ_OBJ_DIR)/autogen=g >> lit.tmp + @$(ECHOPATH) s=@TEST_EXEC_ROOT@=$(PROJ_OBJ_DIR)=g >> lit.tmp + @$(ECHOPATH) s=@TESTSUITE_NAME@=cpp11-migrate Auto-Generated Tests=g >> lit.tmp + @sed -f lit.tmp $(PROJ_SRC_DIR)/../lit.site.cfg.in > $@ + @-rm -f lit.tmp + +all:: $(GENERATED_FILES) autogen/lit.site.cfg + +clean:: + @rm -r autogen + +.PHONY: all clean diff --git a/test/cpp11-migrate/UseAuto/Inputs/gen_my_std.h.py b/test/cpp11-migrate/UseAuto/Inputs/gen_my_std.h.py new file mode 100644 index 00000000..06709abc --- /dev/null +++ b/test/cpp11-migrate/UseAuto/Inputs/gen_my_std.h.py @@ -0,0 +1,98 @@ +#!/usr/bin/python + +typedef_containers = [ + "array", + "deque", + "forward_list", + "list", + "vector" +] +subclass_containers = [ + "map", + "multimap", + "set", + "multiset", +] +using_containers = [ + "unordered_map", + "unordered_multimap", + "unordered_set", + "unordered_multiset", + "queue", + "priority_queue", + "stack" +] + +print """namespace internal { + +template <typename T, int i> +struct iterator_wrapper { +}; + +template <typename T> +class iterator_provider { +public: + class iterator {}; + class const_iterator {}; + class reverse_iterator {}; + class const_reverse_iterator {}; +}; + +} // namespace internal + +namespace std {""" + +iterator_generators = """ + iterator begin() { return iterator(); } + iterator end() { return iterator(); } + + const_iterator begin() const { return const_iterator(); } + const_iterator end() const { return const_iterator(); } + + reverse_iterator rbegin() { return reverse_iterator(); } + reverse_iterator rend() { return reverse_iterator(); } + + const_reverse_iterator rbegin() const { return const_reverse_iterator(); } + const_reverse_iterator rend() const { return const_reverse_iterator(); } +""" + +for c in typedef_containers: + print """ +template <typename T> +class {0} {{ +public: + typedef typename internal::iterator_wrapper<{0}<T>, 0> iterator; + typedef typename internal::iterator_wrapper<{0}<T>, 1> const_iterator; + typedef typename internal::iterator_wrapper<{0}<T>, 3> reverse_iterator; + typedef typename internal::iterator_wrapper<{0}<T>, 2> const_reverse_iterator; + + {0}() {{}} + {1}}};""".format(c, iterator_generators) + +for c in subclass_containers: + print """ +template <typename T> +class {0} {{ +public: + class iterator {{}}; + class const_iterator {{}}; + class reverse_iterator {{}}; + class const_reverse_iterator {{}}; + + {0}() {{}} + {1}}};""".format(c, iterator_generators) + +for c in using_containers: + print """ +template <typename T> +class {0} : internal::iterator_provider<{0}<T> > {{ +public: + using typename internal::iterator_provider<{0}<T> >::iterator; + using typename internal::iterator_provider<{0}<T> >::const_iterator; + using typename internal::iterator_provider<{0}<T> >::reverse_iterator; + using typename internal::iterator_provider<{0}<T> >::const_reverse_iterator; + + {0}() {{}} + {1}}};""".format(c, iterator_generators) + +print "} // namespace std" diff --git a/test/cpp11-migrate/UseAuto/gen_basic_std_iterator_tests.cpp.py b/test/cpp11-migrate/UseAuto/gen_basic_std_iterator_tests.cpp.py new file mode 100644 index 00000000..56b6f5c4 --- /dev/null +++ b/test/cpp11-migrate/UseAuto/gen_basic_std_iterator_tests.cpp.py @@ -0,0 +1,55 @@ +#!/usr/bin/python + +containers = [ + "array", + "deque", + "forward_list", + "list", + "vector", + "map", + "multimap", + "set", + "multiset", + "unordered_map", + "unordered_multimap", + "unordered_set", + "unordered_multiset", + "queue", + "priority_queue", + "stack" +] + +print """// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp +// RUN: cpp11-migrate -use-auto %t.cpp -- --std=c++11 -I %S/Inputs +// RUN: FileCheck -input-file=%t.cpp %s +// XFAIL: * +#include "my_std.h" + +int main(int argc, char **argv) {""" + +for c in containers: + print """ + {{ + std::{0}<int> C; + std::{0}<int>::iterator I = C.begin(); + // CHECK: auto I = C.begin(); + }} + {{ + std::{0}<int> C; + std::{0}<int>::reverse_iterator I = C.rbegin(); + // CHECK: auto I = C.rbegin(); + }} + {{ + const std::{0}<int> C; + std::{0}<int>::const_iterator I = C.begin(); + // CHECK: auto I = C.begin(); + }} + {{ + const std::{0}<int> C; + std::{0}<int>::const_reverse_iterator I = C.rbegin(); + // CHECK: auto I = C.rbegin(); + }}""".format(c) + +print """ + return 0; +}""" |