aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build2/cc/compile.cxx8
-rw-r--r--build2/cc/guess.cxx4
-rw-r--r--build2/cxx/init.cxx25
-rw-r--r--build2/function.hxx2
-rw-r--r--build2/test/script/regex.hxx6
5 files changed, 29 insertions, 16 deletions
diff --git a/build2/cc/compile.cxx b/build2/cc/compile.cxx
index bb0ad37..d73e67c 100644
--- a/build2/cc/compile.cxx
+++ b/build2/cc/compile.cxx
@@ -2945,11 +2945,13 @@ namespace build2
if (ps)
psrc.active = true; // Re-arm.
- // VC15 is not (yet) using the 'export module' syntax so use the
- // preprequisite type to distinguish between interface and
+ // Prior to 15u5 VC was not using the 'export module' syntax so we
+ // use the preprequisite type to distinguish between interface and
// implementation units.
//
- if (cid == compiler_id::msvc && src.is_a (*x_mod))
+ if (cid == compiler_id::msvc &&
+ cmaj == 19 && cmin <= 11 &&
+ src.is_a (*x_mod))
{
// It's quite painful to guard the export with an #if/#endif so
// if it is present, "fixup" the (temporary) preprocessed output
diff --git a/build2/cc/guess.cxx b/build2/cc/guess.cxx
index df7899b..6dea97d 100644
--- a/build2/cc/guess.cxx
+++ b/build2/cc/guess.cxx
@@ -1034,6 +1034,7 @@ namespace build2
//
// year ver cl.exe crt/dll
//
+ // 2017 15u5 19.12 14.1/140
// 2017 15u3 19.11 14.1/140
// 2017 15 19.10 14.1/140
// 2015 14 19.00 14.0/140
@@ -1044,7 +1045,8 @@ namespace build2
// 2005 8 14.00 8.0/80
// 2003 7.1 13.10 7.1/71
//
- /**/ if (v.major == 19 && v.minor == 11) arch += "14.1";
+ /**/ if (v.major == 19 && v.minor == 12) arch += "14.1";
+ else if (v.major == 19 && v.minor == 11) arch += "14.1";
else if (v.major == 19 && v.minor == 10) arch += "14.1";
else if (v.major == 19 && v.minor == 0) arch += "14.0";
else if (v.major == 18 && v.minor == 0) arch += "12.0";
diff --git a/build2/cxx/init.cxx b/build2/cxx/init.cxx
index 5eefa53..c7d6fd9 100644
--- a/build2/cxx/init.cxx
+++ b/build2/cxx/init.cxx
@@ -151,11 +151,16 @@ namespace build2
// While modules are supported in VC15u0 (19.10), there is a
// bug in separate interface/implementation unit support which
// makes them pretty much unusable. This has been fixed in
- // VC15u3 (19.11)
+ // VC15u3 (19.11). And VC15u5 supports the 'export module M;'
+ // syntax.
//
if (mj > 19 || (mj == 19 && mi >= (l ? 10 : 11)))
{
- r.push_back ("/D__cpp_modules=201703"); // n4647
+ r.push_back (
+ mj > 19 || mi > 11
+ ? "/D__cpp_modules=201704" // p0629r0 (export module M;)
+ : "/D__cpp_modules=201703"); // n4647 ( module M;)
+
r.push_back ("/experimental:module");
modules = true;
}
@@ -209,7 +214,8 @@ namespace build2
{
// C++ standard-wise, with VC you got what you got up until 14u2.
// Starting with 14u3 there is now the /std: switch which defaults
- // to c++14 but can be set to c++latest.
+ // to c++14 but can be set to c++latest. And from 15u3 it can be
+ // c++17.
//
// The question is also whether we should verify that the
// requested standard is provided by this VC version. And if so,
@@ -248,12 +254,15 @@ namespace build2
info << "required by " << project (rs) << '@'
<< rs.out_path ();
- // VC14u3 and later has /std:
- //
- if (mj > 19 || (mj == 19 && (mi > 0 || (mi == 0 && p >= 24215))))
+ if (mj > 19 || (mj == 19 && mi >= 11)) // 15u3
+ {
+ if (*v == "14") r.push_back ("/std:c++14");
+ else if (*v == "17") r.push_back ("/std:c++17");
+ }
+ else if (mj == 19 && (mi > 0 || (mi == 0 && p >= 24215))) // 14u3
{
- if (*v == "17")
- r.push_back ("/std:c++latest");
+ if (*v == "14") r.push_back ("/std:c++14");
+ else if (*v == "17") r.push_back ("/std:c++latest");
}
}
break;
diff --git a/build2/function.hxx b/build2/function.hxx
index 96bf401..7507bec 100644
--- a/build2/function.hxx
+++ b/build2/function.hxx
@@ -124,7 +124,7 @@ namespace build2
// std::is_pod appears to be broken in VC15 and also in GCC up to
// 5 (pointers to members).
//
-#if !((defined(_MSC_VER) && _MSC_VER <= 1911) || \
+#if !((defined(_MSC_VER) && _MSC_VER <= 1912) || \
(defined(__GNUC__) && !defined(__clang__) && __GNUC__ <= 5))
static_assert (std::is_pod<D>::value, "type is not POD");
#endif
diff --git a/build2/test/script/regex.hxx b/build2/test/script/regex.hxx
index 696fb2a..c8c3877 100644
--- a/build2/test/script/regex.hxx
+++ b/build2/test/script/regex.hxx
@@ -424,7 +424,7 @@ namespace std
//
template <>
class ctype<build2::test::script::regex::line_char>: public ctype_base
-#if !defined(_MSC_VER) || _MSC_VER > 1911
+#if !defined(_MSC_VER) || _MSC_VER > 1912
, public locale::facet
#endif
{
@@ -437,7 +437,7 @@ namespace std
static locale::id id;
-#if !defined(_MSC_VER) || _MSC_VER > 1911
+#if !defined(_MSC_VER) || _MSC_VER > 1912
explicit
ctype (size_t refs = 0): locale::facet (refs) {}
#else
@@ -519,7 +519,7 @@ namespace std
// Workaround for msvcrt bugs. For some reason it assumes such a members
// to be present in a regex_traits specialization.
//
-#if defined(_MSC_VER) && _MSC_VER <= 1911
+#if defined(_MSC_VER) && _MSC_VER <= 1912
static const ctype_base::mask _Ch_upper = ctype_base::upper;
static const ctype_base::mask _Ch_alpha = ctype_base::alpha;