From 07a2342fbc5cd2109b2024a04300086a66b37f3b Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@iit.it>
Date: Fri, 18 Oct 2013 11:55:18 +0200
Subject: CheckTypeSize: Add support for C++

Previously if headers required to check the size of a type can be
compiled with C++ compiler only, the check would fail because the C
compiler fails.  As a consequence, HAVE_${VARIABLE} would be set to
false, and ${VARIABLE} will be empty.

Teach CHECK_TYPE_SIZE to accept a new optional argument LANGUAGE
that allows one to explicitly set the compiler to use.  The new
signature is therefore:

   CHECK_TYPE_SIZE(TYPE VARIABLE [BUILTIN_TYPES_ONLY]
                                 [LANGUAGE <language>])
---
 Modules/CheckTypeSize.cmake | 49 +++++++++++++++++++++++++++++++++++++++------
 1 file changed, 43 insertions(+), 6 deletions(-)

diff --git a/Modules/CheckTypeSize.cmake b/Modules/CheckTypeSize.cmake
index 0798176..a9efae4 100644
--- a/Modules/CheckTypeSize.cmake
+++ b/Modules/CheckTypeSize.cmake
@@ -6,7 +6,8 @@
 #
 # ::
 #
-#   CHECK_TYPE_SIZE(TYPE VARIABLE [BUILTIN_TYPES_ONLY])
+#   CHECK_TYPE_SIZE(TYPE VARIABLE [BUILTIN_TYPES_ONLY]
+#                                 [LANGUAGE <language>])
 #
 # Check if the type exists and determine its size.  On return,
 # "HAVE_${VARIABLE}" holds the existence of the type, and "${VARIABLE}"
@@ -36,6 +37,9 @@
 # check automatically includes the available headers, thus supporting
 # checks of types defined in the headers.
 #
+# If LANGUAGE is set, the specified compiler will be used to perform the
+# check. Acceptable values are C and CXX
+#
 # Despite the name of the macro you may use it to check the size of more
 # complex expressions, too.  To check e.g.  for the size of a struct
 # member you can do something like this:
@@ -79,7 +83,7 @@ get_filename_component(__check_type_size_dir "${CMAKE_CURRENT_LIST_FILE}" PATH)
 
 #-----------------------------------------------------------------------------
 # Helper function.  DO NOT CALL DIRECTLY.
-function(__check_type_size_impl type var map builtin)
+function(__check_type_size_impl type var map builtin language)
   message(STATUS "Check size of ${type}")
 
   # Include header files.
@@ -101,8 +105,13 @@ function(__check_type_size_impl type var map builtin)
 
   # Perform the check.
 
-
-  set(src ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize/${var}.c)
+  if("${language}" STREQUAL "C")
+    set(src ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize/${var}.c)
+  elseif("${language}" STREQUAL "CXX")
+    set(src ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize/${var}.cpp)
+  else()
+    message(FATAL_ERROR "Unknown language:\n  ${language}\nSupported languages: C, CXX.\n")
+  endif()
   set(bin ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckTypeSize/${var}.bin)
   configure_file(${__check_type_size_dir}/CheckTypeSize.c.in ${src} @ONLY)
   try_compile(HAVE_${var} ${CMAKE_BINARY_DIR} ${src}
@@ -176,8 +185,36 @@ endfunction()
 
 #-----------------------------------------------------------------------------
 macro(CHECK_TYPE_SIZE TYPE VARIABLE)
+  # parse arguments
+  unset(doing)
+  foreach(arg ${ARGN})
+    if("x${arg}" STREQUAL "xBUILTIN_TYPES_ONLY")
+      set(_CHECK_TYPE_SIZE_${arg} 1)
+      unset(doing)
+    elseif("x${arg}" STREQUAL "xLANGUAGE") # change to MATCHES for more keys
+      set(doing "${arg}")
+      set(_CHECK_TYPE_SIZE_${doing} "")
+    elseif("x${doing}" STREQUAL "xLANGUAGE")
+      set(_CHECK_TYPE_SIZE_${doing} "${arg}")
+      unset(doing)
+    else()
+      message(FATAL_ERROR "Unknown argument:\n  ${arg}\n")
+    endif()
+  endforeach()
+  if("x${doing}" MATCHES "^x(LANGUAGE)$")
+    message(FATAL_ERROR "Missing argument:\n  ${doing} arguments requires a value\n")
+  endif()
+  if(DEFINED _CHECK_TYPE_SIZE_LANGUAGE)
+    if(NOT "x${_CHECK_TYPE_SIZE_LANGUAGE}" MATCHES "^x(C|CXX)$")
+      message(FATAL_ERROR "Unknown language:\n  ${_CHECK_TYPE_SIZE_LANGUAGE}.\nSupported languages: C, CXX.\n")
+    endif()
+    set(_language ${_CHECK_TYPE_SIZE_LANGUAGE})
+  else()
+    set(_language C)
+  endif()
+
   # Optionally check for standard headers.
-  if("${ARGV2}" STREQUAL "BUILTIN_TYPES_ONLY")
+  if(_CHECK_TYPE_SIZE_BUILTIN_TYPES_ONLY)
     set(_builtin 0)
   else()
     set(_builtin 1)
@@ -190,7 +227,7 @@ macro(CHECK_TYPE_SIZE TYPE VARIABLE)
   set(${VARIABLE}_KEYS)
   set(_map_file ${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/CheckTypeSize/${VARIABLE}.cmake)
   if(NOT DEFINED HAVE_${VARIABLE})
-    __check_type_size_impl(${TYPE} ${VARIABLE} ${_map_file} ${_builtin})
+    __check_type_size_impl(${TYPE} ${VARIABLE} ${_map_file} ${_builtin} ${_language})
   endif()
   include(${_map_file} OPTIONAL)
   set(_map_file)
-- 
cgit v0.12


From e6cec64820e6b39d1e4878f5a1abb2576064d95b Mon Sep 17 00:00:00 2001
From: "Daniele E. Domenichelli" <daniele.domenichelli@iit.it>
Date: Fri, 18 Oct 2013 12:35:04 +0200
Subject: CheckTypeSize: Add unit tests

---
 Tests/Module/CheckTypeSize/CMakeLists.txt          |  15 +-
 Tests/Module/CheckTypeSize/CheckTypeSize.cxx       | 172 +++++++++++++++++++++
 Tests/Module/CheckTypeSize/config.hxx.in           |  23 +++
 Tests/Module/CheckTypeSize/someclass.hxx           |  14 ++
 .../CheckTypeSizeMissingLanguage-result.txt        |   1 +
 .../CheckTypeSizeMissingLanguage-stderr.txt        |   8 +
 .../CheckTypeSizeMissingLanguage.cmake             |   2 +
 .../CheckModules/CheckTypeSizeMixedArgs-result.txt |   1 +
 .../CheckModules/CheckTypeSizeMixedArgs-stderr.txt |  10 ++
 .../CheckModules/CheckTypeSizeMixedArgs.cmake      |   2 +
 Tests/RunCMake/CheckModules/CheckTypeSizeOk.cmake  |  10 ++
 .../CheckTypeSizeUnknownArgument-result.txt        |   1 +
 .../CheckTypeSizeUnknownArgument-stderr.txt        |   8 +
 .../CheckTypeSizeUnknownArgument.cmake             |   2 +
 .../CheckTypeSizeUnknownLanguage-result.txt        |   1 +
 .../CheckTypeSizeUnknownLanguage-stderr.txt        |  10 ++
 .../CheckTypeSizeUnknownLanguage.cmake             |   2 +
 Tests/RunCMake/CheckModules/RunCMakeTest.cmake     |   6 +
 18 files changed, 287 insertions(+), 1 deletion(-)
 create mode 100644 Tests/Module/CheckTypeSize/CheckTypeSize.cxx
 create mode 100644 Tests/Module/CheckTypeSize/config.hxx.in
 create mode 100644 Tests/Module/CheckTypeSize/someclass.hxx
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-result.txt
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-stderr.txt
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage.cmake
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-result.txt
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-stderr.txt
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs.cmake
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeOk.cmake
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-result.txt
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-stderr.txt
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument.cmake
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-result.txt
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-stderr.txt
 create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage.cmake

diff --git a/Tests/Module/CheckTypeSize/CMakeLists.txt b/Tests/Module/CheckTypeSize/CMakeLists.txt
index abe617a..16989fe2 100644
--- a/Tests/Module/CheckTypeSize/CMakeLists.txt
+++ b/Tests/Module/CheckTypeSize/CMakeLists.txt
@@ -1,6 +1,7 @@
 cmake_minimum_required(VERSION 2.8.1 FATAL_ERROR)
-project(CheckTypeSize C)
+project(CheckTypeSize)
 
+# Check C types
 include(CheckTypeSize)
 check_type_size("void*"     SIZEOF_DATA_PTR)
 check_type_size(char        SIZEOF_CHAR)
@@ -18,7 +19,19 @@ check_type_size("((struct somestruct*)0)->someint" SIZEOF_STRUCTMEMBER_INT)
 check_type_size("((struct somestruct*)0)->someptr" SIZEOF_STRUCTMEMBER_PTR)
 check_type_size("((struct somestruct*)0)->somechar" SIZEOF_STRUCTMEMBER_CHAR)
 
+# Check CXX types
+check_type_size(bool        SIZEOF_BOOL LANGUAGE CXX)
+
+set(CMAKE_EXTRA_INCLUDE_FILES someclass.hxx)
+check_type_size("((ns::someclass*)0)->someint" SIZEOF_NS_CLASSMEMBER_INT LANGUAGE CXX)
+check_type_size("((ns::someclass*)0)->someptr" SIZEOF_NS_CLASSMEMBER_PTR LANGUAGE CXX)
+check_type_size("((ns::someclass*)0)->somechar" SIZEOF_NS_CLASSMEMBER_CHAR LANGUAGE CXX)
+check_type_size("((ns::someclass*)0)->somebool" SIZEOF_NS_CLASSMEMBER_BOOL LANGUAGE CXX)
+
 configure_file(config.h.in config.h)
+configure_file(config.hxx.in config.hxx)
+
 include_directories("${CheckTypeSize_BINARY_DIR}")
 
 add_executable(CheckTypeSize CheckTypeSize.c)
+add_executable(CheckTypeSizeCXX CheckTypeSize.cxx)
diff --git a/Tests/Module/CheckTypeSize/CheckTypeSize.cxx b/Tests/Module/CheckTypeSize/CheckTypeSize.cxx
new file mode 100644
index 0000000..b5692cd
--- /dev/null
+++ b/Tests/Module/CheckTypeSize/CheckTypeSize.cxx
@@ -0,0 +1,172 @@
+#include "config.h"
+#include "config.hxx"
+#include "someclass.hxx"
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_STDDEF_H
+# include <stddef.h>
+#endif
+
+#include <stdio.h>
+
+#define CHECK(t,m) do {                                                 \
+  if(sizeof(t) != m)                                                    \
+    {                                                                   \
+    printf(#m ": expected %d, got %d (line %d)\n",                      \
+           (int)sizeof(t), (int)m, __LINE__);                           \
+    result = 1;                                                         \
+    }                                                                   \
+  } while(0)
+
+#define NODEF(m) do {                                                   \
+  printf(#m": not defined (line %d)\n", __LINE__);                      \
+  result = 1;                                                           \
+  } while(0)
+
+int main()
+{
+  int result = 0;
+  ns::someclass y;
+
+  /* void* */
+#if !defined(HAVE_SIZEOF_DATA_PTR)
+  NODEF(HAVE_SIZEOF_DATA_PTR);
+#endif
+#if defined(SIZEOF_DATA_PTR)
+  CHECK(void*, SIZEOF_DATA_PTR);
+#else
+  NODEF(SIZEOF_DATA_PTR);
+#endif
+
+  /* char */
+#if !defined(HAVE_SIZEOF_CHAR)
+  NODEF(HAVE_SIZEOF_CHAR);
+#endif
+#if defined(SIZEOF_CHAR)
+  CHECK(char, SIZEOF_CHAR);
+#else
+  NODEF(SIZEOF_CHAR);
+#endif
+
+  /* short */
+#if !defined(HAVE_SIZEOF_SHORT)
+  NODEF(HAVE_SIZEOF_SHORT);
+#endif
+#if defined(SIZEOF_SHORT)
+  CHECK(short, SIZEOF_SHORT);
+#else
+  NODEF(SIZEOF_SHORT);
+#endif
+
+  /* int */
+#if !defined(HAVE_SIZEOF_INT)
+  NODEF(HAVE_SIZEOF_INT);
+#endif
+#if defined(SIZEOF_INT)
+  CHECK(int, SIZEOF_INT);
+#else
+  NODEF(SIZEOF_INT);
+#endif
+
+  /* long */
+#if !defined(HAVE_SIZEOF_LONG)
+  NODEF(HAVE_SIZEOF_LONG);
+#endif
+#if defined(SIZEOF_LONG)
+  CHECK(long, SIZEOF_LONG);
+#else
+  NODEF(SIZEOF_LONG);
+#endif
+
+  /* long long */
+#if defined(SIZEOF_LONG_LONG)
+  CHECK(long long, SIZEOF_LONG_LONG);
+# if !defined(HAVE_SIZEOF_LONG_LONG)
+  NODEF(HAVE_SIZEOF_LONG_LONG);
+# endif
+#endif
+
+  /* __int64 */
+#if defined(SIZEOF___INT64)
+  CHECK(__int64, SIZEOF___INT64);
+# if !defined(HAVE_SIZEOF___INT64)
+  NODEF(HAVE_SIZEOF___INT64);
+# endif
+#elif defined(HAVE_SIZEOF___INT64)
+  NODEF(SIZEOF___INT64);
+#endif
+
+  /* size_t */
+#if !defined(HAVE_SIZEOF_SIZE_T)
+  NODEF(HAVE_SIZEOF_SIZE_T);
+#endif
+#if defined(SIZEOF_SIZE_T)
+  CHECK(size_t, SIZEOF_SIZE_T);
+#else
+  NODEF(SIZEOF_SIZE_T);
+#endif
+
+  /* ssize_t */
+#if defined(SIZEOF_SSIZE_T)
+  CHECK(ssize_t, SIZEOF_SSIZE_T);
+# if !defined(HAVE_SIZEOF_SSIZE_T)
+  NODEF(HAVE_SIZEOF_SSIZE_T);
+# endif
+#elif defined(HAVE_SIZEOF_SSIZE_T)
+  NODEF(SIZEOF_SSIZE_T);
+#endif
+
+  /* ns::someclass::someint */
+#if defined(SIZEOF_NS_CLASSMEMBER_INT)
+  CHECK(y.someint, SIZEOF_NS_CLASSMEMBER_INT);
+  CHECK(y.someint, SIZEOF_INT);
+# if !defined(HAVE_SIZEOF_NS_CLASSMEMBER_INT)
+  NODEF(HAVE_SIZEOF_STRUCTMEMBER_INT);
+# endif
+#elif defined(HAVE_SIZEOF_STRUCTMEMBER_INT)
+  NODEF(SIZEOF_STRUCTMEMBER_INT);
+#endif
+
+  /* ns::someclass::someptr */
+#if defined(SIZEOF_NS_CLASSMEMBER_PTR)
+  CHECK(y.someptr, SIZEOF_NS_CLASSMEMBER_PTR);
+  CHECK(y.someptr, SIZEOF_DATA_PTR);
+# if !defined(HAVE_SIZEOF_NS_CLASSMEMBER_PTR)
+  NODEF(HAVE_SIZEOF_NS_CLASSMEMBER_PTR);
+# endif
+#elif defined(HAVE_SIZEOF_NS_CLASSMEMBER_PTR)
+  NODEF(SIZEOF_NS_CLASSMEMBER_PTR);
+#endif
+
+  /* ns::someclass::somechar */
+#if defined(SIZEOF_NS_CLASSMEMBER_CHAR)
+  CHECK(y.somechar, SIZEOF_NS_CLASSMEMBER_CHAR);
+  CHECK(y.somechar, SIZEOF_CHAR);
+# if !defined(HAVE_SIZEOF_NS_CLASSMEMBER_CHAR)
+  NODEF(HAVE_SIZEOF_NS_CLASSMEMBER_CHAR);
+# endif
+#elif defined(HAVE_SIZEOF_NS_CLASSMEMBER_CHAR)
+  NODEF(SIZEOF_NS_CLASSMEMBER_CHAR);
+#endif
+
+  /* ns::someclass::somebool */
+#if defined(SIZEOF_NS_CLASSMEMBER_BOOL)
+  CHECK(y.somechar, SIZEOF_NS_CLASSMEMBER_BOOL);
+  CHECK(y.somechar, SIZEOF_BOOL);
+# if !defined(HAVE_SIZEOF_NS_CLASSMEMBER_BOOL)
+  NODEF(HAVE_SIZEOF_NS_CLASSMEMBER_BOOL);
+# endif
+#elif defined(HAVE_SIZEOF_NS_CLASSMEMBER_BOOL)
+  NODEF(SIZEOF_NS_CLASSMEMBER_BOOL);
+#endif
+
+  /* to avoid possible warnings about unused or write-only variable */
+  y.someint = result;
+
+  return y.someint;
+}
diff --git a/Tests/Module/CheckTypeSize/config.hxx.in b/Tests/Module/CheckTypeSize/config.hxx.in
new file mode 100644
index 0000000..8c66ade
--- /dev/null
+++ b/Tests/Module/CheckTypeSize/config.hxx.in
@@ -0,0 +1,23 @@
+#cmakedefine HAVE_SYS_TYPES_H
+#cmakedefine HAVE_STDINT_H
+#cmakedefine HAVE_STDDEF_H
+
+/* bool */
+#cmakedefine HAVE_SIZEOF_BOOL
+@SIZEOF_BOOL_CODE@
+
+/* struct ns::somestruct::someint */
+#cmakedefine HAVE_SIZEOF_NS_STRUCTMEMBER_INT
+@SIZEOF_NS_STRUCTMEMBER_INT_CODE@
+
+/* struct ns::somestruct::someptr */
+#cmakedefine HAVE_SIZEOF_NS_STRUCTMEMBER_PTR
+@SIZEOF_NS_STRUCTMEMBER_PTR_CODE@
+
+/* struct ns::somestruct::somechar */
+#cmakedefine HAVE_SIZEOF_NS_STRUCTMEMBER_CHAR
+@SIZEOF_NS_STRUCTMEMBER_CHAR_CODE@
+
+/* struct ns::somestruct::somebool */
+#cmakedefine HAVE_SIZEOF_NS_STRUCTMEMBER_BOOL
+@SIZEOF_NS_STRUCTMEMBER_BOOL_CODE@
diff --git a/Tests/Module/CheckTypeSize/someclass.hxx b/Tests/Module/CheckTypeSize/someclass.hxx
new file mode 100644
index 0000000..76c07ec
--- /dev/null
+++ b/Tests/Module/CheckTypeSize/someclass.hxx
@@ -0,0 +1,14 @@
+#ifndef _CMAKE_SOMECLASS_HXX
+#define _CMAKE_SOMECLASS_HXX
+
+namespace ns {
+class someclass {
+public:
+    int someint;
+    void *someptr;
+    char somechar;
+    bool somebool;
+};
+}
+
+#endif
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-result.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-stderr.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-stderr.txt
new file mode 100644
index 0000000..07ec8e6
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-stderr.txt
@@ -0,0 +1,8 @@
+CMake Error at .*/Modules/CheckTypeSize.cmake:[0-9]+ \(message\):
+  Missing argument:
+
+    LANGUAGE arguments requires a value
+
+Call Stack \(most recent call first\):
+  CheckTypeSizeMissingLanguage.cmake:[0-9]+ \(check_type_size\)
+  CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage.cmake b/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage.cmake
new file mode 100644
index 0000000..3fae6c4
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage.cmake
@@ -0,0 +1,2 @@
+include(CheckTypeSize)
+check_type_size(int SIZEOF_INT LANGUAGE)
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-result.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-stderr.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-stderr.txt
new file mode 100644
index 0000000..a2d2fc0
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-stderr.txt
@@ -0,0 +1,10 @@
+CMake Error at .*/Modules/CheckTypeSize.cmake:[0-9]+. \(message\):
+  Unknown language:
+
+    .
+
+  Supported languages: C, CXX.
+
+Call Stack \(most recent call first\):
+  CheckTypeSizeMixedArgs.cmake:[0-9]+ \(check_type_size\)
+  CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs.cmake b/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs.cmake
new file mode 100644
index 0000000..d2ccc0f
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs.cmake
@@ -0,0 +1,2 @@
+include(CheckTypeSize)
+check_type_size(int SIZEOF_INT LANGUAGE BUILTIN_TYPES_ONLY)
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeOk.cmake b/Tests/RunCMake/CheckModules/CheckTypeSizeOk.cmake
new file mode 100644
index 0000000..558f07e
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeOk.cmake
@@ -0,0 +1,10 @@
+include(CheckTypeSize)
+check_type_size(int SIZEOF_INT)
+check_type_size(int SIZEOF_INT BUILTIN_TYPES_ONLY)
+check_type_size(int SIZEOF_INT LANGUAGE C)
+check_type_size(int SIZEOF_INT LANGUAGE CXX)
+check_type_size(int SIZEOF_INT BUILTIN_TYPES_ONLY LANGUAGE C)
+
+# Weird but ok... only last value is considered
+check_type_size(int SIZEOF_INT BUILTIN_TYPES_ONLY BUILTIN_TYPES_ONLY)
+check_type_size(int SIZEOF_INT LANGUAGE C LANGUAGE CXX)
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-result.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-stderr.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-stderr.txt
new file mode 100644
index 0000000..085488e
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-stderr.txt
@@ -0,0 +1,8 @@
+CMake Error at .*/Modules/CheckTypeSize.cmake:[0-9]+. \(message\):
+  Unknown argument:
+
+    LANGUAG
+
+Call Stack \(most recent call first\):
+  CheckTypeSizeUnknownArgument.cmake:[0-9]+ \(check_type_size\)
+  CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument.cmake b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument.cmake
new file mode 100644
index 0000000..6f24ee1
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument.cmake
@@ -0,0 +1,2 @@
+include(CheckTypeSize)
+check_type_size(int SIZEOF_INT BUILTIN_TYPES_ONLY LANGUAG CXX)
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-result.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-stderr.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-stderr.txt
new file mode 100644
index 0000000..502a717
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-stderr.txt
@@ -0,0 +1,10 @@
+CMake Error at .*/Modules/CheckTypeSize.cmake:[0-9]+. \(message\):
+  Unknown language:
+
+    FORTRAN.
+
+  Supported languages: C, CXX.
+
+Call Stack \(most recent call first\):
+  CheckTypeSizeUnknownLanguage.cmake:[0-9]+ \(check_type_size\)
+  CMakeLists.txt:[0-9]+ \(include\)
diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage.cmake b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage.cmake
new file mode 100644
index 0000000..2d5184c
--- /dev/null
+++ b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage.cmake
@@ -0,0 +1,2 @@
+include(CheckTypeSize)
+check_type_size(int SIZEOF_INT LANGUAGE FORTRAN)
diff --git a/Tests/RunCMake/CheckModules/RunCMakeTest.cmake b/Tests/RunCMake/CheckModules/RunCMakeTest.cmake
index 6a6b36e..fda7ebf 100644
--- a/Tests/RunCMake/CheckModules/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CheckModules/RunCMakeTest.cmake
@@ -6,3 +6,9 @@ run_cmake(CheckStructHasMemberMissingLanguage)
 run_cmake(CheckStructHasMemberMissingKey)
 run_cmake(CheckStructHasMemberTooManyArguments)
 run_cmake(CheckStructHasMemberWrongKey)
+
+run_cmake(CheckTypeSizeOk)
+run_cmake(CheckTypeSizeUnknownLanguage)
+run_cmake(CheckTypeSizeMissingLanguage)
+run_cmake(CheckTypeSizeUnknownArgument)
+run_cmake(CheckTypeSizeMixedArgs)
-- 
cgit v0.12