Reviewer changes:
- Fixed a typo
- changed 'autogen' to 'generated-tests'
Hi silvas,
http://llvm-reviews.chandlerc.com/D423
CHANGE SINCE LAST DIFF
http://llvm-reviews.chandlerc.com/D423?vs=1022&id=1023#toc
Files:
test/CMakeLists.txt
test/Makefile
test/cpp11-migrate/CMakeLists.txt
test/cpp11-migrate/Makefile
test/cpp11-migrate/UseAuto/Inputs/gen_my_std.h.py
test/cpp11-migrate/UseAuto/gen_basic_std_iterator_tests.cpp.py
test/lit.cfg
test/lit.site.cfg.in
Index: test/CMakeLists.txt
===================================================================
--- test/CMakeLists.txt
+++ test/CMakeLists.txt
@@ -7,28 +7,36 @@
set(CLANG_TOOLS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..")
set(CLANG_TOOLS_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/..")
-configure_lit_site_cfg(
- ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in
- ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
- )
-
option(CLANG_TOOLS_TEST_USE_VG "Run Clang tools' tests under Valgrind" OFF)
if(CLANG_TOOLS_TEST_USE_VG)
set(CLANG_TOOLS_TEST_EXTRA_ARGS ${CLANG_TEST_EXTRA_ARGS} "--vg")
endif()
+add_subdirectory(cpp11-migrate)
+
+set(TEST_SOURCE_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
+set(TEST_EXEC_ROOT ${CMAKE_CURRENT_BINARY_DIR})
+set(TESTSUITE_NAME "Clang Tools")
+configure_lit_site_cfg(
+ ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in
+ ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
+ )
+
set(CLANG_TOOLS_TEST_DEPS
# Base line deps.
clang clang-headers FileCheck count not
+ # cpp11-migrate auto-generated tests. See cpp11-migrate/CMakeLists.txt.
+ cpp11-migrate-autogen
+
# Individual tools we test.
remove-cstr-calls cpp11-migrate clang-format
)
add_lit_testsuite(check-clang-tools "Running the Clang extra tools' regression tests"
${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_CURRENT_BINARY_DIR}/cpp11-migrate/generated_tests
DEPENDS ${CLANG_TOOLS_TEST_DEPS}
ARGS ${CLANG_TOOLS_TEST_EXTRA_ARGS}
)
set_target_properties(check-clang-tools PROPERTIES FOLDER "Clang extra tools' tests")
-
Index: test/Makefile
===================================================================
--- test/Makefile
+++ test/Makefile
@@ -8,6 +8,10 @@
##===----------------------------------------------------------------------===##
CLANG_LEVEL := ../../..
+include $(CLANG_LEVEL)/../../Makefile.config
+
+# Recurse into any subdirectories that have their own Makefiles.
+DIRS := cpp11-migrate
include $(CLANG_LEVEL)/Makefile
# Test in all immediate subdirectories if unset.
@@ -23,6 +27,9 @@
# Allow EXTRA_TESTDIRS to provide additional test directories.
TESTDIRS += $(EXTRA_TESTDIRS)
+# List of roots for auto-generated tests.
+TESTDIRS += $(PROJ_OBJ_DIR)/cpp11-migrate/generated_tests
+
ifndef TESTARGS
ifdef VERBOSE
TESTARGS = -v
@@ -54,6 +61,9 @@
@$(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_SRC_DIR)=g >> lit.tmp
+ @$(ECHOPATH) s=@TEST_EXEC_ROOT@=$(PROJ_OBJ_DIR)=g >> lit.tmp
+ @$(ECHOPATH) s=@TESTSUITE_NAME@=Clang Tools=g >> lit.tmp
@sed -f lit.tmp $(PROJ_SRC_DIR)/lit.site.cfg.in > $@
@-rm -f lit.tmp
Index: test/cpp11-migrate/CMakeLists.txt
===================================================================
--- /dev/null
+++ 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})/generated_tests/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}/generated_tests/${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}/generated_tests/${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}/generated_tests)
+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}/generated_tests/lit.site.cfg
+ )
Index: test/cpp11-migrate/Makefile
===================================================================
--- /dev/null
+++ 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)/generated_tests.
+
+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)/generated_tests/$(dir <script name>).
+#
+# One argument required: the name of generator script relative to
+# $(PROJ_SRC_DIR).
+define autogenerate-file
+OUTFILE := $(addprefix generated_tests/$(dir $1), $(patsubst gen_%.py,%,$(notdir $1)))
+GENERATED_FILES := $$(GENERATED_FILES) $$(OUTFILE)
+$$(OUTFILE): $1
+ @echo "Autogenerating $$<"
+ @$(MKDIR) $(addprefix generated_tests/, $(dir $1))
+ @$(PYTHON) $$< > $$@
+endef
+$(foreach script, $(GENERATOR_SCRIPTS), $(eval $(call autogenerate-file,$(script))))
+
+FORCE:
+
+generated_tests/lit.site.cfg: FORCE
+ @$(MKDIR) $(PROJ_OBJ_DIR)/generated_tests
+ @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)/generated_tests=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) generated_tests/lit.site.cfg
+
+clean::
+ @rm -r generated_tests
+
+.PHONY: all clean
Index: test/cpp11-migrate/UseAuto/Inputs/gen_my_std.h.py
===================================================================
--- /dev/null
+++ 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"
Index: test/cpp11-migrate/UseAuto/gen_basic_std_iterator_tests.cpp.py
===================================================================
--- /dev/null
+++ 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;
+}"""
Index: test/lit.cfg
===================================================================
--- test/lit.cfg
+++ test/lit.cfg
@@ -8,12 +8,9 @@
# Configuration file for the 'lit' test runner.
-# name: The name of this test suite.
-config.name = 'Clang Tools'
-
# Tweak PATH for Win32
if platform.system() == 'Windows':
- # Seek sane tools in directories and set to $PATH.
+ # Seek sane tools in directories and set to $PATH.
path = getattr(config, 'lit_tools_dir', None)
path = lit.getToolsPath(path,
config.environment['PATH'],
@@ -34,14 +31,6 @@
# suffixes: A list of file extensions to treat as test files.
config.suffixes = ['.c', '.cpp', '.m', '.mm', '.cu', '.ll', '.cl', '.s']
-# test_source_root: The root path where tests are located.
-config.test_source_root = os.path.dirname(__file__)
-
-# test_exec_root: The root path where tests should be run.
-clang_tools_binary_dir = getattr(config, 'clang_tools_binary_dir', None)
-if clang_tools_binary_dir is not None:
- config.test_exec_root = os.path.join(clang_tools_binary_dir, 'test')
-
# Clear some environment variables that might affect Clang.
#
# This first set of vars are read by Clang, but shouldn't affect tests
@@ -72,7 +61,7 @@
del config.environment[name]
# Tweak the PATH to include the tools dir and the scripts dir.
-if clang_tools_binary_dir is not None:
+if hasattr(config, 'clang_tools_binary_dir'):
llvm_tools_dir = getattr(config, 'llvm_tools_dir', None)
if not llvm_tools_dir:
lit.fatal('No LLVM tools dir set!')
Index: test/lit.site.cfg.in
===================================================================
--- test/lit.site.cfg.in
+++ test/lit.site.cfg.in
@@ -8,6 +8,10 @@
config.clang_tools_binary_dir = "@CLANG_TOOLS_BINARY_DIR@"
config.target_triple = "@TARGET_TRIPLE@"
+config.name = "@TESTSUITE_NAME@"
+config.test_source_root = "@TEST_SOURCE_ROOT@"
+config.test_exec_root = "@TEST_EXEC_ROOT@"
+
# Support substitution of the tools and libs dirs with user parameters. This is
# used when we can't determine the tool dir at configuration time.
try:
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits