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

Reply via email to