aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2017-02-08 09:24:07 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2017-02-13 12:42:42 +0200
commit8aee78c8d0eb06334571e596f6fbdf7ed5756f0c (patch)
tree12899b0b09c8fcbaf3a1064b28db8f6161003cbe
parent5cefca444f7062c61cc9d118ffea5901e05186fd (diff)
Tighten target constness further
-rw-r--r--build2/bin/target14
-rw-r--r--build2/cc/utility.cxx4
-rw-r--r--build2/cli/rule.cxx2
-rw-r--r--build2/cli/target39
-rw-r--r--build2/cli/target.cxx9
-rw-r--r--build2/target18
-rw-r--r--build2/target.cxx2
-rw-r--r--old-tests/cli/lib/libtest/test/buildfile4
-rw-r--r--old-tests/cli/lib/test/buildfile2
-rw-r--r--old-tests/cli/simple/buildfile2
10 files changed, 43 insertions, 53 deletions
diff --git a/build2/bin/target b/build2/bin/target
index 85a84df..0108f09 100644
--- a/build2/bin/target
+++ b/build2/bin/target
@@ -51,9 +51,11 @@ namespace build2
public:
using target::target;
- obje* e {nullptr};
- obja* a {nullptr};
- objs* s {nullptr};
+ // Group members.
+ //
+ const_ptr<obje> e = nullptr;
+ const_ptr<obja> a = nullptr;
+ const_ptr<objs> s = nullptr;
public:
static const target_type static_type;
@@ -87,8 +89,10 @@ namespace build2
public:
using target::target;
- liba* a {nullptr};
- libs* s {nullptr};
+ // Group members.
+ //
+ const_ptr<liba> a = nullptr;
+ const_ptr<libs> s = nullptr;
virtual void
reset (action_type) override;
diff --git a/build2/cc/utility.cxx b/build2/cc/utility.cxx
index 4ccdcaf..62febfa 100644
--- a/build2/cc/utility.cxx
+++ b/build2/cc/utility.cxx
@@ -62,10 +62,8 @@ namespace build2
}
}
- target* r (ls ? static_cast<target*> (l.s) : l.a);
-
+ const target* r (ls ? static_cast<const target*> (l.s) : l.a);
assert (r != nullptr);
-
return *r;
}
diff --git a/build2/cli/rule.cxx b/build2/cli/rule.cxx
index 7928c5c..ba4963e 100644
--- a/build2/cli/rule.cxx
+++ b/build2/cli/rule.cxx
@@ -207,7 +207,7 @@ namespace build2
static void
append_extension (cstrings& args,
- path_target& t,
+ const path_target& t,
const char* option,
const char* default_extension)
{
diff --git a/build2/cli/target b/build2/cli/target
index f4ab7e7..c10e4b8 100644
--- a/build2/cli/target
+++ b/build2/cli/target
@@ -26,37 +26,22 @@ namespace build2
virtual const target_type& dynamic_type () const {return static_type;}
};
- class cli_cxx: public mtime_target
+ // Standard layout type compatible with target*[3].
+ //
+ struct cli_cxx_members
{
- public:
- union
- {
- // It is theoretically possible that the compiler will add
- // padding between the members of this struct. This would
- // mean that the optimal alignment for a pointer is greater
- // than its size (and that an array of pointers is sub-
- // optimally aligned). We will deal with such a beast of
- // an architecture when we see it.
- //
- struct
- {
- cxx::hxx* h;
- cxx::cxx* c;
- cxx::ixx* i;
- };
- target* m[3] /*= {nullptr, nullptr, nullptr}*/; // @@ GCC 4.8
- };
-
- //using mtime_target::mtime_target; // @@ GCC 4.8
+ const_ptr<cxx::hxx> h = nullptr;
+ const_ptr<cxx::cxx> c = nullptr;
+ const_ptr<cxx::ixx> i = nullptr;
+ };
- cli_cxx (dir_path d, dir_path o, string n)
- : mtime_target (move (d), move (o), move (n))
- {
- m[0] = m[1] = m[2] = nullptr;
- }
+ class cli_cxx: public mtime_target, public cli_cxx_members
+ {
+ public:
+ using mtime_target::mtime_target;
virtual group_view
- group_members (action_type) const;
+ group_members (action_type);
virtual timestamp
load_mtime () const;
diff --git a/build2/cli/target.cxx b/build2/cli/target.cxx
index 48dc95b..200f6f0 100644
--- a/build2/cli/target.cxx
+++ b/build2/cli/target.cxx
@@ -32,10 +32,15 @@ namespace build2
// cli.cxx
//
group_view cli_cxx::
- group_members (action_type) const
+ group_members (action_type)
{
+ static_assert (offsetof (cli_cxx_members, i) -
+ offsetof (cli_cxx_members, h) == sizeof (target*) * 2,
+ "member layout incompatible with array");
+
return h != nullptr
- ? group_view {m, (i != nullptr ? 3U : 2U)}
+ ? group_view {reinterpret_cast<target* const*> (&h),
+ (i != nullptr ? 3U : 2U)}
: group_view {nullptr, 0};
}
diff --git a/build2/target b/build2/target
index 90aaeec..6cc492a 100644
--- a/build2/target
+++ b/build2/target
@@ -250,7 +250,7 @@ namespace build2
// resolve_group_members() from <build2/algorithm>.
//
virtual group_view
- group_members (action_type) const;
+ group_members (action_type);
// Note that the returned key "tracks" the target (except for the
// extension).
@@ -475,9 +475,11 @@ namespace build2
//
// Currenly the data is not destroyed until the next match.
//
- static constexpr size_t data_size = sizeof (string) * 4;
- std::aligned_storage<data_size>::type data_pad;
- void (*data_dtor) (void*) = nullptr;
+ // Note that the recipe may modify (mutable) the data.
+ //
+ static constexpr size_t data_size = sizeof (string) * 4;
+ mutable std::aligned_storage<data_size>::type data_pad;
+ mutable void (*data_dtor) (void*) = nullptr;
template <typename R,
typename T = typename std::remove_cv<
@@ -503,14 +505,10 @@ namespace build2
template <typename T>
T&
- data () {return *reinterpret_cast<T*> (&data_pad);}
-
- template <typename T>
- const T&
- data () const {return *reinterpret_cast<const T*> (&data_pad);}
+ data () const {return *reinterpret_cast<T*> (&data_pad);}
void
- clear_data ()
+ clear_data () const
{
if (data_dtor != nullptr)
{
diff --git a/build2/target.cxx b/build2/target.cxx
index ad448cb..b22dfce 100644
--- a/build2/target.cxx
+++ b/build2/target.cxx
@@ -139,7 +139,7 @@ namespace build2
}
group_view target::
- group_members (action_type) const
+ group_members (action_type)
{
assert (false); // Not a group or doesn't expose its members.
return group_view {nullptr, 0};
diff --git a/old-tests/cli/lib/libtest/test/buildfile b/old-tests/cli/lib/libtest/test/buildfile
index 6b0d9bd..a7667e6 100644
--- a/old-tests/cli/lib/libtest/test/buildfile
+++ b/old-tests/cli/lib/libtest/test/buildfile
@@ -13,8 +13,8 @@ extra/:
--cli-namespace test::extra::cli
}
-cxx.poptions += -I$out_root -I$src_root
-lib{test}: cxx.export.poptions = -I$out_root -I$src_root
+cxx.poptions += "-I$out_root" "-I$src_root"
+lib{test}: cxx.export.poptions = "-I$out_root" "-I$src_root"
cli.options += --include-prefix test --guard-prefix TEST \
--cli-namespace test::cli
diff --git a/old-tests/cli/lib/test/buildfile b/old-tests/cli/lib/test/buildfile
index d3e784d..1f3d65c 100644
--- a/old-tests/cli/lib/test/buildfile
+++ b/old-tests/cli/lib/test/buildfile
@@ -3,4 +3,4 @@ import libs += cli-lib-libtest%lib{test}
exe{driver}: cxx{driver} cli.cxx{test} $libs
cli.cxx{test}: cli{test}
-cxx.poptions += -I$out_root
+cxx.poptions += "-I$out_root"
diff --git a/old-tests/cli/simple/buildfile b/old-tests/cli/simple/buildfile
index 47e06d9..ddbf27c 100644
--- a/old-tests/cli/simple/buildfile
+++ b/old-tests/cli/simple/buildfile
@@ -4,7 +4,7 @@ hxx{*}: extension =
cxx{*}: extension = cpp
ixx{*}: extension = ipp
-cxx.poptions += -I$out_root
+cxx.poptions += "-I$out_root"
using cli