summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkim Demaille <akim@lrde.epita.fr>2015-01-05 18:20:28 +0100
committerAkim Demaille <akim@lrde.epita.fr>2015-01-05 18:32:23 +0100
commit56351d4c7b3be8a81953defa7e34503976d3589b (patch)
tree25511679180c87c48985ecea5b430f0562d52c5e
parent478c4a8f495f4b665e6bcb5b5a669089a7bd614a (diff)
downloadbison-56351d4c7b3be8a81953defa7e34503976d3589b.tar.gz
c++: locations: complete the API and fix comments
There are no support for += between locations, and some comments are wrong. Reported by Alexandre Duret-Lutz. * data/location.cc: Fix. * doc/bison.texi: Document. * tests/c++.at: Check.
-rw-r--r--data/location.cc30
-rw-r--r--doc/bison.texi13
-rw-r--r--tests/c++.at7
3 files changed, 34 insertions, 16 deletions
diff --git a/data/location.cc b/data/location.cc
index 8e8a2c27..53fddd48 100644
--- a/data/location.cc
+++ b/data/location.cc
@@ -83,7 +83,7 @@ m4_define([b4_position_define],
}
};
- /// Add and assign a position.
+ /// Add \a width columns, in place.
inline position&
operator+= (position& res, int width)
{
@@ -91,21 +91,21 @@ m4_define([b4_position_define],
return res;
}
- /// Add two position objects.
+ /// Add \a width columns.
inline position
operator+ (position res, int width)
{
return res += width;
}
- /// Add and assign a position.
+ /// Subtract \a width columns, in place.
inline position&
operator-= (position& res, int width)
{
return res += -width;
}
- /// Add two position objects.
+ /// Subtract \a width columns.
inline position
operator- (position res, int width)
{
@@ -216,36 +216,42 @@ m4_define([b4_location_define],
position end;
};
- /// Join two location objects to create a location.
- inline location operator+ (location res, const location& end)
+ /// Join two locations, in place.
+ inline location& operator+= (location& res, const location& end)
{
res.end = end.end;
return res;
}
- /// Change end position in place.
+ /// Join two locations.
+ inline location operator+ (location res, const location& end)
+ {
+ return res += end;
+ }
+
+ /// Add \a width columns to the end position, in place.
inline location& operator+= (location& res, int width)
{
res.columns (width);
return res;
}
- /// Change end position.
+ /// Add \a width columns to the end position.
inline location operator+ (location res, int width)
{
return res += width;
}
- /// Change end position in place.
+ /// Subtract \a width columns to the end position, in place.
inline location& operator-= (location& res, int width)
{
return res += -width;
}
- /// Change end position.
- inline location operator- (const location& begin, int width)
+ /// Subtract \a width columns to the end position.
+ inline location operator- (location res, int width)
{
- return begin + -width;
+ return res -= width;
}
]b4_percent_define_flag_if([[define_location_comparison]], [[
/// Compare two location objects.
diff --git a/doc/bison.texi b/doc/bison.texi
index 11bd2d86..d4022159 100644
--- a/doc/bison.texi
+++ b/doc/bison.texi
@@ -10686,12 +10686,17 @@ The first, inclusive, position of the range, and the first beyond.
Forwarded to the @code{end} position.
@end deftypemethod
-@deftypemethod {location} {location} operator+ (const location& @var{end})
-@deftypemethodx {location} {location} operator+ (int @var{width})
+@deftypemethod {location} {location} operator+ (int @var{width})
@deftypemethodx {location} {location} operator+= (int @var{width})
-@deftypemethodx {location} {location} operator- (int @var{width})
+@deftypemethodx {location} {location} operator- (int @var{width})
@deftypemethodx {location} {location} operator-= (int @var{width})
-Various forms of syntactic sugar.
+Various forms of syntactic sugar for @code{columns}.
+@end deftypemethod
+
+@deftypemethod {location} {location} operator+ (const location& @var{end})
+@deftypemethodx {location} {location} operator+= (const location& @var{end})
+Join two locations: starts at the position of the first one, and ends at the
+position of the second.
@end deftypemethod
@deftypemethod {location} {void} step ()
diff --git a/tests/c++.at b/tests/c++.at
index f1586f55..4dbfb760 100644
--- a/tests/c++.at
+++ b/tests/c++.at
@@ -60,8 +60,10 @@ main (void)
{
int fail = 0;
]AT_YYLTYPE[ loc; fail += check (loc, "1.1");
+ fail += check (loc + 10, "1.1-10");
loc += 10; fail += check (loc, "1.1-10");
loc += -5; fail += check (loc, "1.1-5");
+ fail += check (loc - 5, "1.1");
loc -= 5; fail += check (loc, "1.1");
// Check that we don't go below.
// http://lists.gnu.org/archive/html/bug-bison/2013-02/msg00000.html
@@ -70,6 +72,11 @@ main (void)
loc.columns (10); loc.lines (10); fail += check (loc, "1.1-11.0");
loc.lines (-2); fail += check (loc, "1.1-9.0");
loc.lines (-10); fail += check (loc, "1.1");
+
+ ]AT_YYLTYPE[ loc2 (YY_NULLPTR, 5, 10);
+ fail += check (loc2, "5.10");
+ fail += check (loc + loc2, "1.1-5.9");
+ loc += loc2; fail += check (loc, "1.1-5.9");
return !fail;
}
]])