linux-gpio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [libgpiod] [PATCH 1/5] bindings: cxx: Use 'upstream' include path
@ 2019-08-07 19:51 Alexander Stein
  2019-08-07 19:51 ` [libgpiod] [PATCH 2/5] bindings: cxx: Try using pkg-config to detect catch2 Alexander Stein
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Alexander Stein @ 2019-08-07 19:51 UTC (permalink / raw)
  To: linux-gpio; +Cc: Alexander Stein

According to https://github.com/catchorg/Catch2/issues/1202 the
regular include is 'catch2/catch.hpp'
Also CMake and pkg-config provide include paths for this include name.

Signed-off-by: Alexander Stein <alexander.stein@mailbox.org>
---
 bindings/cxx/tests/gpiod-cxx-test.cpp | 2 +-
 bindings/cxx/tests/tests-chip.cpp     | 2 +-
 bindings/cxx/tests/tests-event.cpp    | 2 +-
 bindings/cxx/tests/tests-iter.cpp     | 2 +-
 bindings/cxx/tests/tests-line.cpp     | 2 +-
 configure.ac                          | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/bindings/cxx/tests/gpiod-cxx-test.cpp b/bindings/cxx/tests/gpiod-cxx-test.cpp
index fbae84f..236fd2d 100644
--- a/bindings/cxx/tests/gpiod-cxx-test.cpp
+++ b/bindings/cxx/tests/gpiod-cxx-test.cpp
@@ -6,7 +6,7 @@
  */
 
 #define CATCH_CONFIG_MAIN
-#include <catch.hpp>
+#include <catch2/catch.hpp>
 #include <linux/version.h>
 #include <sys/utsname.h>
 #include <system_error>
diff --git a/bindings/cxx/tests/tests-chip.cpp b/bindings/cxx/tests/tests-chip.cpp
index 276b533..11c2d4c 100644
--- a/bindings/cxx/tests/tests-chip.cpp
+++ b/bindings/cxx/tests/tests-chip.cpp
@@ -5,7 +5,7 @@
  * Copyright (C) 2019 Bartosz Golaszewski <bgolaszewski@baylibre.com>
  */
 
-#include <catch.hpp>
+#include <catch2/catch.hpp>
 #include <gpiod.hpp>
 
 #include "gpio-mockup.hpp"
diff --git a/bindings/cxx/tests/tests-event.cpp b/bindings/cxx/tests/tests-event.cpp
index f93bb72..b34347f 100644
--- a/bindings/cxx/tests/tests-event.cpp
+++ b/bindings/cxx/tests/tests-event.cpp
@@ -5,7 +5,7 @@
  * Copyright (C) 2019 Bartosz Golaszewski <bgolaszewski@baylibre.com>
  */
 
-#include <catch.hpp>
+#include <catch2/catch.hpp>
 #include <gpiod.hpp>
 #include <map>
 #include <poll.h>
diff --git a/bindings/cxx/tests/tests-iter.cpp b/bindings/cxx/tests/tests-iter.cpp
index 1af0256..fdc2cb5 100644
--- a/bindings/cxx/tests/tests-iter.cpp
+++ b/bindings/cxx/tests/tests-iter.cpp
@@ -5,7 +5,7 @@
  * Copyright (C) 2019 Bartosz Golaszewski <bgolaszewski@baylibre.com>
  */
 
-#include <catch.hpp>
+#include <catch2/catch.hpp>
 #include <gpiod.hpp>
 
 #include "gpio-mockup.hpp"
diff --git a/bindings/cxx/tests/tests-line.cpp b/bindings/cxx/tests/tests-line.cpp
index 2684bcb..e827e60 100644
--- a/bindings/cxx/tests/tests-line.cpp
+++ b/bindings/cxx/tests/tests-line.cpp
@@ -5,7 +5,7 @@
  * Copyright (C) 2019 Bartosz Golaszewski <bgolaszewski@baylibre.com>
  */
 
-#include <catch.hpp>
+#include <catch2/catch.hpp>
 #include <gpiod.hpp>
 
 #include "gpio-mockup.hpp"
diff --git a/configure.ac b/configure.ac
index f72e13b..0459007 100644
--- a/configure.ac
+++ b/configure.ac
@@ -165,7 +165,7 @@ then
 	if test "x$with_tests" = xtrue
 	then
 		AC_LANG_PUSH([C++])
-		AC_CHECK_HEADERS([catch.hpp], [], [HEADER_NOT_FOUND_CXX([catch.hpp])])
+		AC_CHECK_HEADERS([catch2/catch.hpp], [], [HEADER_NOT_FOUND_CXX([catch2/catch.hpp])])
 		AC_LANG_POP([C++])
 	fi
 fi
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [libgpiod] [PATCH 2/5] bindings: cxx: Try using pkg-config to detect catch2
  2019-08-07 19:51 [libgpiod] [PATCH 1/5] bindings: cxx: Use 'upstream' include path Alexander Stein
@ 2019-08-07 19:51 ` Alexander Stein
  2019-08-07 19:51 ` [libgpiod] [PATCH 3/5] bindings: cxx: Split out catch's main() Alexander Stein
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 10+ messages in thread
From: Alexander Stein @ 2019-08-07 19:51 UTC (permalink / raw)
  To: linux-gpio; +Cc: Alexander Stein

If there is no system wide package, try using a regular header as before.

Signed-off-by: Alexander Stein <alexander.stein@mailbox.org>
---
 bindings/cxx/tests/Makefile.am | 2 +-
 configure.ac                   | 8 +++++---
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/bindings/cxx/tests/Makefile.am b/bindings/cxx/tests/Makefile.am
index 155445f..d1da0d3 100644
--- a/bindings/cxx/tests/Makefile.am
+++ b/bindings/cxx/tests/Makefile.am
@@ -8,7 +8,7 @@
 
 AM_CPPFLAGS = -I$(top_srcdir)/bindings/cxx/ -I$(top_srcdir)/include
 AM_CPPFLAGS += -I$(top_srcdir)/tests/mockup/
-AM_CPPFLAGS += -Wall -Wextra -g -std=gnu++11
+AM_CPPFLAGS += -Wall -Wextra -g -std=gnu++11 $(CATCH2_CFLAGS)
 AM_LDFLAGS = -lgpiodcxx -L$(top_builddir)/bindings/cxx/
 AM_LDFLAGS += -lgpiomockup -L$(top_builddir)/tests/mockup/
 AM_LDFLAGS += -pthread
diff --git a/configure.ac b/configure.ac
index 0459007..bf364e7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -164,9 +164,11 @@ then
 
 	if test "x$with_tests" = xtrue
 	then
-		AC_LANG_PUSH([C++])
-		AC_CHECK_HEADERS([catch2/catch.hpp], [], [HEADER_NOT_FOUND_CXX([catch2/catch.hpp])])
-		AC_LANG_POP([C++])
+		PKG_CHECK_MODULES([CATCH2], [catch2],, [
+			AC_LANG_PUSH([C++])
+			AC_CHECK_HEADERS([catch2/catch.hpp], [], [HEADER_NOT_FOUND_CXX([catch2/catch.hpp])])
+			AC_LANG_POP([C++])
+		])
 	fi
 fi
 
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [libgpiod] [PATCH 3/5] bindings: cxx: Split out catch's main()
  2019-08-07 19:51 [libgpiod] [PATCH 1/5] bindings: cxx: Use 'upstream' include path Alexander Stein
  2019-08-07 19:51 ` [libgpiod] [PATCH 2/5] bindings: cxx: Try using pkg-config to detect catch2 Alexander Stein
@ 2019-08-07 19:51 ` Alexander Stein
  2019-08-07 19:51 ` [libgpiod] [PATCH 4/5] bindings: cxx: Fix compile errors Alexander Stein
  2019-08-07 19:51 ` [libgpiod] [PATCH 5/5] bindings: cxx: Workaround --success run Alexander Stein
  3 siblings, 0 replies; 10+ messages in thread
From: Alexander Stein @ 2019-08-07 19:51 UTC (permalink / raw)
  To: linux-gpio; +Cc: Alexander Stein

Compiling the source using CATCH_CONFIG_MAIN to provide main() takes
several seconds, so split it out from any library testing code, so it
really needs to be built once only.

Signed-off-by: Alexander Stein <alexander.stein@mailbox.org>
---
 bindings/cxx/tests/Makefile.am             | 3 ++-
 bindings/cxx/tests/gpiod-cxx-test-main.cpp | 2 ++
 bindings/cxx/tests/gpiod-cxx-test.cpp      | 2 --
 3 files changed, 4 insertions(+), 3 deletions(-)
 create mode 100644 bindings/cxx/tests/gpiod-cxx-test-main.cpp

diff --git a/bindings/cxx/tests/Makefile.am b/bindings/cxx/tests/Makefile.am
index d1da0d3..5800a23 100644
--- a/bindings/cxx/tests/Makefile.am
+++ b/bindings/cxx/tests/Makefile.am
@@ -15,7 +15,8 @@ AM_LDFLAGS += -pthread
 
 bin_PROGRAMS = gpiod-cxx-test
 
-gpiod_cxx_test_SOURCES =	gpiod-cxx-test.cpp \
+gpiod_cxx_test_SOURCES =	gpiod-cxx-test-main.cpp \
+				gpiod-cxx-test.cpp \
 				gpio-mockup.cpp \
 				gpio-mockup.hpp \
 				tests-chip.cpp \
diff --git a/bindings/cxx/tests/gpiod-cxx-test-main.cpp b/bindings/cxx/tests/gpiod-cxx-test-main.cpp
new file mode 100644
index 0000000..4ed06df
--- /dev/null
+++ b/bindings/cxx/tests/gpiod-cxx-test-main.cpp
@@ -0,0 +1,2 @@
+#define CATCH_CONFIG_MAIN
+#include <catch2/catch.hpp>
diff --git a/bindings/cxx/tests/gpiod-cxx-test.cpp b/bindings/cxx/tests/gpiod-cxx-test.cpp
index 236fd2d..e110a3c 100644
--- a/bindings/cxx/tests/gpiod-cxx-test.cpp
+++ b/bindings/cxx/tests/gpiod-cxx-test.cpp
@@ -5,8 +5,6 @@
  * Copyright (C) 2019 Bartosz Golaszewski <bgolaszewski@baylibre.com>
  */
 
-#define CATCH_CONFIG_MAIN
-#include <catch2/catch.hpp>
 #include <linux/version.h>
 #include <sys/utsname.h>
 #include <system_error>
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [libgpiod] [PATCH 4/5] bindings: cxx: Fix compile errors
  2019-08-07 19:51 [libgpiod] [PATCH 1/5] bindings: cxx: Use 'upstream' include path Alexander Stein
  2019-08-07 19:51 ` [libgpiod] [PATCH 2/5] bindings: cxx: Try using pkg-config to detect catch2 Alexander Stein
  2019-08-07 19:51 ` [libgpiod] [PATCH 3/5] bindings: cxx: Split out catch's main() Alexander Stein
@ 2019-08-07 19:51 ` Alexander Stein
  2019-08-08 15:25   ` Bartosz Golaszewski
  2019-08-07 19:51 ` [libgpiod] [PATCH 5/5] bindings: cxx: Workaround --success run Alexander Stein
  3 siblings, 1 reply; 10+ messages in thread
From: Alexander Stein @ 2019-08-07 19:51 UTC (permalink / raw)
  To: linux-gpio; +Cc: Alexander Stein

This fixes the following compile errors:
tests-event.cpp:152:3: error: cannot declare reference to
'class std::system_error&', which is not a typedef or a template type
argument
  152 |   REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error&);

Signed-off-by: Alexander Stein <alexander.stein@mailbox.org>
---
 bindings/cxx/tests/tests-chip.cpp  |  8 ++++----
 bindings/cxx/tests/tests-event.cpp |  4 ++--
 bindings/cxx/tests/tests-line.cpp  | 16 ++++++++--------
 3 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/bindings/cxx/tests/tests-chip.cpp b/bindings/cxx/tests/tests-chip.cpp
index 11c2d4c..c9eb8e5 100644
--- a/bindings/cxx/tests/tests-chip.cpp
+++ b/bindings/cxx/tests/tests-chip.cpp
@@ -107,7 +107,7 @@ TEST_CASE("Uninitialized GPIO chip behaves correctly", "[chip]")
 
 	SECTION("using uninitialized chip throws logic_error")
 	{
-		REQUIRE_THROWS_AS(chip.name(), ::std::logic_error&);
+		REQUIRE_THROWS_AS(chip.name(), ::std::logic_error);
 	}
 }
 
@@ -139,7 +139,7 @@ TEST_CASE("GPIO chip can be opened with the open() method with implicit lookup",
 
 TEST_CASE("Trying to open a nonexistent chip throws system_error", "[chip]")
 {
-	REQUIRE_THROWS_AS(::gpiod::chip("nonexistent-chip"), ::std::system_error&);
+	REQUIRE_THROWS_AS(::gpiod::chip("nonexistent-chip"), ::std::system_error);
 }
 
 TEST_CASE("Chip object can be reset", "[chip]")
@@ -244,12 +244,12 @@ TEST_CASE("Errors occurring when retrieving lines are correctly reported", "[chi
 
 	SECTION("invalid offset (single line)")
 	{
-		REQUIRE_THROWS_AS(chip.get_line(9), ::std::out_of_range&);
+		REQUIRE_THROWS_AS(chip.get_line(9), ::std::out_of_range);
 	}
 
 	SECTION("invalid offset (multiple lines)")
 	{
-		REQUIRE_THROWS_AS(chip.get_lines({ 1, 19, 4, 7 }), ::std::out_of_range&);
+		REQUIRE_THROWS_AS(chip.get_lines({ 1, 19, 4, 7 }), ::std::out_of_range);
 	}
 
 	SECTION("line not found by name")
diff --git a/bindings/cxx/tests/tests-event.cpp b/bindings/cxx/tests/tests-event.cpp
index b34347f..b41cf7e 100644
--- a/bindings/cxx/tests/tests-event.cpp
+++ b/bindings/cxx/tests/tests-event.cpp
@@ -149,7 +149,7 @@ TEST_CASE("It's possible to retrieve the event file descriptor", "[event][line]"
 
 	SECTION("error if not requested")
 	{
-		REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error&);
+		REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error);
 	}
 
 	SECTION("error if requested for values")
@@ -157,7 +157,7 @@ TEST_CASE("It's possible to retrieve the event file descriptor", "[event][line]"
 		config.request_type = ::gpiod::line_request::DIRECTION_INPUT;
 
 		line.request(config);
-		REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error&);
+		REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error);
 	}
 }
 
diff --git a/bindings/cxx/tests/tests-line.cpp b/bindings/cxx/tests/tests-line.cpp
index e827e60..08ff1e8 100644
--- a/bindings/cxx/tests/tests-line.cpp
+++ b/bindings/cxx/tests/tests-line.cpp
@@ -122,7 +122,7 @@ TEST_CASE("Line bulk object works correctly", "[line][bulk]")
 	{
 		auto lines = chip.get_all_lines();
 
-		REQUIRE_THROWS_AS(lines.get(11), ::std::out_of_range&);
+		REQUIRE_THROWS_AS(lines.get(11), ::std::out_of_range);
 	}
 }
 
@@ -242,7 +242,7 @@ TEST_CASE("Exported line can be released", "[line]")
 	line.release();
 
 	REQUIRE_FALSE(line.is_requested());
-	REQUIRE_THROWS_AS(line.get_value(), ::std::system_error&);
+	REQUIRE_THROWS_AS(line.get_value(), ::std::system_error);
 }
 
 TEST_CASE("Uninitialized GPIO line behaves correctly", "[line]")
@@ -256,7 +256,7 @@ TEST_CASE("Uninitialized GPIO line behaves correctly", "[line]")
 
 	SECTION("using uninitialized line throws logic_error")
 	{
-		REQUIRE_THROWS_AS(line.name(), ::std::logic_error&);
+		REQUIRE_THROWS_AS(line.name(), ::std::logic_error);
 	}
 }
 
@@ -271,7 +271,7 @@ TEST_CASE("Uninitialized GPIO line_bulk behaves correctly", "[line][bulk]")
 
 	SECTION("using uninitialized line_bulk throws logic_error")
 	{
-		REQUIRE_THROWS_AS(bulk.get(0), ::std::logic_error&);
+		REQUIRE_THROWS_AS(bulk.get(0), ::std::logic_error);
 	}
 }
 
@@ -289,7 +289,7 @@ TEST_CASE("Cannot request the same line twice", "[line]")
 		auto line = chip.get_line(3);
 
 		REQUIRE_NOTHROW(line.request(config));
-		REQUIRE_THROWS_AS(line.request(config), ::std::system_error&);
+		REQUIRE_THROWS_AS(line.request(config), ::std::system_error);
 	}
 
 	SECTION("request the same line twice in line_bulk")
@@ -300,7 +300,7 @@ TEST_CASE("Cannot request the same line twice", "[line]")
 		 */
 		auto lines = chip.get_lines({ 2, 3, 4, 4 });
 
-		REQUIRE_THROWS_AS(lines.request(config), ::std::system_error&);
+		REQUIRE_THROWS_AS(lines.request(config), ::std::system_error);
 	}
 }
 
@@ -312,12 +312,12 @@ TEST_CASE("Cannot get/set values of unrequested lines", "[line]")
 
 	SECTION("get value")
 	{
-		REQUIRE_THROWS_AS(line.get_value(), ::std::system_error&);
+		REQUIRE_THROWS_AS(line.get_value(), ::std::system_error);
 	}
 
 	SECTION("set value")
 	{
-		REQUIRE_THROWS_AS(line.set_value(1), ::std::system_error&);
+		REQUIRE_THROWS_AS(line.set_value(1), ::std::system_error);
 	}
 }
 
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [libgpiod] [PATCH 5/5] bindings: cxx: Workaround --success run
  2019-08-07 19:51 [libgpiod] [PATCH 1/5] bindings: cxx: Use 'upstream' include path Alexander Stein
                   ` (2 preceding siblings ...)
  2019-08-07 19:51 ` [libgpiod] [PATCH 4/5] bindings: cxx: Fix compile errors Alexander Stein
@ 2019-08-07 19:51 ` Alexander Stein
  2019-08-08 15:27   ` Bartosz Golaszewski
  3 siblings, 1 reply; 10+ messages in thread
From: Alexander Stein @ 2019-08-07 19:51 UTC (permalink / raw)
  To: linux-gpio; +Cc: Alexander Stein

If run with --success, all expressions are evaluated and printed out.
But REQUIRE_FALSE(chip) tries to iterate over the chip resulting in this
backtrace:
#0  gpiod_chip_num_lines (chip=chip@entry=0x0) at ../../lib/core.c:235
#1  gpiod_line_iter_new (chip=0x0) at ../../lib/iter.c:140
#2  gpiod::(anonymous namespace)::make_line_iter (chip=0x0) at ../../../bindings/cxx/iter.cpp:29
#3  gpiod::line_iter::line_iter (this=0x7fffffffd690, owner=...) at ../../../bindings/cxx/iter.cpp:109
#4  Catch::rangeToString<gpiod::chip> (range=...) at /usr/include/catch2/catch.hpp:1959
[...]

Workaround by forcing catch2 to call gpiod::chip::operator bool().

Signed-off-by: Alexander Stein <alexander.stein@mailbox.org>
---
This actually looks like a flaw in the binding itself that the
gpiod::line_iter can't cope with an empty gpiod::chip.

 bindings/cxx/tests/tests-chip.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/bindings/cxx/tests/tests-chip.cpp b/bindings/cxx/tests/tests-chip.cpp
index c9eb8e5..1c69872 100644
--- a/bindings/cxx/tests/tests-chip.cpp
+++ b/bindings/cxx/tests/tests-chip.cpp
@@ -70,7 +70,7 @@ TEST_CASE("GPIO chip can be opened with the open() method in different modes", "
 	mockup::probe_guard mockup_chips({ 8, 8, 8 });
 	::gpiod::chip chip;
 
-	REQUIRE_FALSE(chip);
+	REQUIRE_FALSE(!!chip);
 
 	SECTION("open by name")
 	{
@@ -102,7 +102,7 @@ TEST_CASE("Uninitialized GPIO chip behaves correctly", "[chip]")
 
 	SECTION("uninitialized chip is 'false'")
 	{
-		REQUIRE_FALSE(chip);
+		REQUIRE_FALSE(!!chip);
 	}
 
 	SECTION("using uninitialized chip throws logic_error")
@@ -149,7 +149,7 @@ TEST_CASE("Chip object can be reset", "[chip]")
 	::gpiod::chip chip(mockup::instance().chip_name(0));
 	REQUIRE(chip);
 	chip.reset();
-	REQUIRE_FALSE(chip);
+	REQUIRE_FALSE(!!chip);
 }
 
 TEST_CASE("Chip info can be correctly retrieved", "[chip]")
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [libgpiod] [PATCH 4/5] bindings: cxx: Fix compile errors
  2019-08-07 19:51 ` [libgpiod] [PATCH 4/5] bindings: cxx: Fix compile errors Alexander Stein
@ 2019-08-08 15:25   ` Bartosz Golaszewski
  2019-08-08 15:37     ` Bartosz Golaszewski
  0 siblings, 1 reply; 10+ messages in thread
From: Bartosz Golaszewski @ 2019-08-08 15:25 UTC (permalink / raw)
  To: Alexander Stein; +Cc: open list:GPIO SUBSYSTEM

śr., 7 sie 2019 o 21:51 Alexander Stein <alexander.stein@mailbox.org>
napisał(a):
>
> This fixes the following compile errors:
> tests-event.cpp:152:3: error: cannot declare reference to
> 'class std::system_error&', which is not a typedef or a template type
> argument
>   152 |   REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error&);
>

Hi Alexander, thanks for working on this!

I'm getting the following warning when I don't use the reference:

In file included from tests-line.cpp:8:
tests-line.cpp: In function ‘void ____C_A_T_C_H____T_E_S_T____24()’:
tests-line.cpp:254:45: warning: catching polymorphic type ‘class
std::system_error’ by value [-Wcatch-value=]
  REQUIRE_THROWS_AS(line.get_value(), ::std::system_error);
                                             ^~~~~~~~~~~~
I'm also not getting any build errors with my current next or master
branch. My gcc is:

gcc (Debian 8.3.0-6) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Bart

> Signed-off-by: Alexander Stein <alexander.stein@mailbox.org>
> ---
>  bindings/cxx/tests/tests-chip.cpp  |  8 ++++----
>  bindings/cxx/tests/tests-event.cpp |  4 ++--
>  bindings/cxx/tests/tests-line.cpp  | 16 ++++++++--------
>  3 files changed, 14 insertions(+), 14 deletions(-)
>
> diff --git a/bindings/cxx/tests/tests-chip.cpp b/bindings/cxx/tests/tests-chip.cpp
> index 11c2d4c..c9eb8e5 100644
> --- a/bindings/cxx/tests/tests-chip.cpp
> +++ b/bindings/cxx/tests/tests-chip.cpp
> @@ -107,7 +107,7 @@ TEST_CASE("Uninitialized GPIO chip behaves correctly", "[chip]")
>
>         SECTION("using uninitialized chip throws logic_error")
>         {
> -               REQUIRE_THROWS_AS(chip.name(), ::std::logic_error&);
> +               REQUIRE_THROWS_AS(chip.name(), ::std::logic_error);
>         }
>  }
>
> @@ -139,7 +139,7 @@ TEST_CASE("GPIO chip can be opened with the open() method with implicit lookup",
>
>  TEST_CASE("Trying to open a nonexistent chip throws system_error", "[chip]")
>  {
> -       REQUIRE_THROWS_AS(::gpiod::chip("nonexistent-chip"), ::std::system_error&);
> +       REQUIRE_THROWS_AS(::gpiod::chip("nonexistent-chip"), ::std::system_error);
>  }
>
>  TEST_CASE("Chip object can be reset", "[chip]")
> @@ -244,12 +244,12 @@ TEST_CASE("Errors occurring when retrieving lines are correctly reported", "[chi
>
>         SECTION("invalid offset (single line)")
>         {
> -               REQUIRE_THROWS_AS(chip.get_line(9), ::std::out_of_range&);
> +               REQUIRE_THROWS_AS(chip.get_line(9), ::std::out_of_range);
>         }
>
>         SECTION("invalid offset (multiple lines)")
>         {
> -               REQUIRE_THROWS_AS(chip.get_lines({ 1, 19, 4, 7 }), ::std::out_of_range&);
> +               REQUIRE_THROWS_AS(chip.get_lines({ 1, 19, 4, 7 }), ::std::out_of_range);
>         }
>
>         SECTION("line not found by name")
> diff --git a/bindings/cxx/tests/tests-event.cpp b/bindings/cxx/tests/tests-event.cpp
> index b34347f..b41cf7e 100644
> --- a/bindings/cxx/tests/tests-event.cpp
> +++ b/bindings/cxx/tests/tests-event.cpp
> @@ -149,7 +149,7 @@ TEST_CASE("It's possible to retrieve the event file descriptor", "[event][line]"
>
>         SECTION("error if not requested")
>         {
> -               REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error&);
> +               REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error);
>         }
>
>         SECTION("error if requested for values")
> @@ -157,7 +157,7 @@ TEST_CASE("It's possible to retrieve the event file descriptor", "[event][line]"
>                 config.request_type = ::gpiod::line_request::DIRECTION_INPUT;
>
>                 line.request(config);
> -               REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error&);
> +               REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error);
>         }
>  }
>
> diff --git a/bindings/cxx/tests/tests-line.cpp b/bindings/cxx/tests/tests-line.cpp
> index e827e60..08ff1e8 100644
> --- a/bindings/cxx/tests/tests-line.cpp
> +++ b/bindings/cxx/tests/tests-line.cpp
> @@ -122,7 +122,7 @@ TEST_CASE("Line bulk object works correctly", "[line][bulk]")
>         {
>                 auto lines = chip.get_all_lines();
>
> -               REQUIRE_THROWS_AS(lines.get(11), ::std::out_of_range&);
> +               REQUIRE_THROWS_AS(lines.get(11), ::std::out_of_range);
>         }
>  }
>
> @@ -242,7 +242,7 @@ TEST_CASE("Exported line can be released", "[line]")
>         line.release();
>
>         REQUIRE_FALSE(line.is_requested());
> -       REQUIRE_THROWS_AS(line.get_value(), ::std::system_error&);
> +       REQUIRE_THROWS_AS(line.get_value(), ::std::system_error);
>  }
>
>  TEST_CASE("Uninitialized GPIO line behaves correctly", "[line]")
> @@ -256,7 +256,7 @@ TEST_CASE("Uninitialized GPIO line behaves correctly", "[line]")
>
>         SECTION("using uninitialized line throws logic_error")
>         {
> -               REQUIRE_THROWS_AS(line.name(), ::std::logic_error&);
> +               REQUIRE_THROWS_AS(line.name(), ::std::logic_error);
>         }
>  }
>
> @@ -271,7 +271,7 @@ TEST_CASE("Uninitialized GPIO line_bulk behaves correctly", "[line][bulk]")
>
>         SECTION("using uninitialized line_bulk throws logic_error")
>         {
> -               REQUIRE_THROWS_AS(bulk.get(0), ::std::logic_error&);
> +               REQUIRE_THROWS_AS(bulk.get(0), ::std::logic_error);
>         }
>  }
>
> @@ -289,7 +289,7 @@ TEST_CASE("Cannot request the same line twice", "[line]")
>                 auto line = chip.get_line(3);
>
>                 REQUIRE_NOTHROW(line.request(config));
> -               REQUIRE_THROWS_AS(line.request(config), ::std::system_error&);
> +               REQUIRE_THROWS_AS(line.request(config), ::std::system_error);
>         }
>
>         SECTION("request the same line twice in line_bulk")
> @@ -300,7 +300,7 @@ TEST_CASE("Cannot request the same line twice", "[line]")
>                  */
>                 auto lines = chip.get_lines({ 2, 3, 4, 4 });
>
> -               REQUIRE_THROWS_AS(lines.request(config), ::std::system_error&);
> +               REQUIRE_THROWS_AS(lines.request(config), ::std::system_error);
>         }
>  }
>
> @@ -312,12 +312,12 @@ TEST_CASE("Cannot get/set values of unrequested lines", "[line]")
>
>         SECTION("get value")
>         {
> -               REQUIRE_THROWS_AS(line.get_value(), ::std::system_error&);
> +               REQUIRE_THROWS_AS(line.get_value(), ::std::system_error);
>         }
>
>         SECTION("set value")
>         {
> -               REQUIRE_THROWS_AS(line.set_value(1), ::std::system_error&);
> +               REQUIRE_THROWS_AS(line.set_value(1), ::std::system_error);
>         }
>  }
>
> --
> 2.22.0
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [libgpiod] [PATCH 5/5] bindings: cxx: Workaround --success run
  2019-08-07 19:51 ` [libgpiod] [PATCH 5/5] bindings: cxx: Workaround --success run Alexander Stein
@ 2019-08-08 15:27   ` Bartosz Golaszewski
  2019-08-08 18:41     ` Alexander Stein
  0 siblings, 1 reply; 10+ messages in thread
From: Bartosz Golaszewski @ 2019-08-08 15:27 UTC (permalink / raw)
  To: Alexander Stein; +Cc: open list:GPIO SUBSYSTEM

śr., 7 sie 2019 o 21:51 Alexander Stein <alexander.stein@mailbox.org>
napisał(a):
>
> If run with --success, all expressions are evaluated and printed out.
> But REQUIRE_FALSE(chip) tries to iterate over the chip resulting in this
> backtrace:
> #0  gpiod_chip_num_lines (chip=chip@entry=0x0) at ../../lib/core.c:235
> #1  gpiod_line_iter_new (chip=0x0) at ../../lib/iter.c:140
> #2  gpiod::(anonymous namespace)::make_line_iter (chip=0x0) at ../../../bindings/cxx/iter.cpp:29
> #3  gpiod::line_iter::line_iter (this=0x7fffffffd690, owner=...) at ../../../bindings/cxx/iter.cpp:109
> #4  Catch::rangeToString<gpiod::chip> (range=...) at /usr/include/catch2/catch.hpp:1959
> [...]
>
> Workaround by forcing catch2 to call gpiod::chip::operator bool().
>
> Signed-off-by: Alexander Stein <alexander.stein@mailbox.org>
> ---
> This actually looks like a flaw in the binding itself that the
> gpiod::line_iter can't cope with an empty gpiod::chip.
>

Do you want to submit a patch that fixes that? Otherwise I can fix it.
I think that simply throwing an exception on empty chip is enough,
right?

Bart

>  bindings/cxx/tests/tests-chip.cpp | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/bindings/cxx/tests/tests-chip.cpp b/bindings/cxx/tests/tests-chip.cpp
> index c9eb8e5..1c69872 100644
> --- a/bindings/cxx/tests/tests-chip.cpp
> +++ b/bindings/cxx/tests/tests-chip.cpp
> @@ -70,7 +70,7 @@ TEST_CASE("GPIO chip can be opened with the open() method in different modes", "
>         mockup::probe_guard mockup_chips({ 8, 8, 8 });
>         ::gpiod::chip chip;
>
> -       REQUIRE_FALSE(chip);
> +       REQUIRE_FALSE(!!chip);
>
>         SECTION("open by name")
>         {
> @@ -102,7 +102,7 @@ TEST_CASE("Uninitialized GPIO chip behaves correctly", "[chip]")
>
>         SECTION("uninitialized chip is 'false'")
>         {
> -               REQUIRE_FALSE(chip);
> +               REQUIRE_FALSE(!!chip);
>         }
>
>         SECTION("using uninitialized chip throws logic_error")
> @@ -149,7 +149,7 @@ TEST_CASE("Chip object can be reset", "[chip]")
>         ::gpiod::chip chip(mockup::instance().chip_name(0));
>         REQUIRE(chip);
>         chip.reset();
> -       REQUIRE_FALSE(chip);
> +       REQUIRE_FALSE(!!chip);
>  }
>
>  TEST_CASE("Chip info can be correctly retrieved", "[chip]")
> --
> 2.22.0
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [libgpiod] [PATCH 4/5] bindings: cxx: Fix compile errors
  2019-08-08 15:25   ` Bartosz Golaszewski
@ 2019-08-08 15:37     ` Bartosz Golaszewski
  0 siblings, 0 replies; 10+ messages in thread
From: Bartosz Golaszewski @ 2019-08-08 15:37 UTC (permalink / raw)
  To: Alexander Stein; +Cc: open list:GPIO SUBSYSTEM

czw., 8 sie 2019 o 17:25 Bartosz Golaszewski <brgl@bgdev.pl> napisał(a):
>
> śr., 7 sie 2019 o 21:51 Alexander Stein <alexander.stein@mailbox.org>
> napisał(a):
> >
> > This fixes the following compile errors:
> > tests-event.cpp:152:3: error: cannot declare reference to
> > 'class std::system_error&', which is not a typedef or a template type
> > argument
> >   152 |   REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error&);
> >
>
> Hi Alexander, thanks for working on this!
>
> I'm getting the following warning when I don't use the reference:
>
> In file included from tests-line.cpp:8:
> tests-line.cpp: In function ‘void ____C_A_T_C_H____T_E_S_T____24()’:
> tests-line.cpp:254:45: warning: catching polymorphic type ‘class
> std::system_error’ by value [-Wcatch-value=]
>   REQUIRE_THROWS_AS(line.get_value(), ::std::system_error);
>                                              ^~~~~~~~~~~~
> I'm also not getting any build errors with my current next or master
> branch. My gcc is:
>
> gcc (Debian 8.3.0-6) 8.3.0
> Copyright (C) 2018 Free Software Foundation, Inc.
> This is free software; see the source for copying conditions.  There is NO
> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
>
> Bart

Nevermind that - I was using Debian's packaged version which happens
to be quite old. The current version actually does fail to build. I'll
test and pick up your patches tomorrow.

Bart

>
> > Signed-off-by: Alexander Stein <alexander.stein@mailbox.org>
> > ---
> >  bindings/cxx/tests/tests-chip.cpp  |  8 ++++----
> >  bindings/cxx/tests/tests-event.cpp |  4 ++--
> >  bindings/cxx/tests/tests-line.cpp  | 16 ++++++++--------
> >  3 files changed, 14 insertions(+), 14 deletions(-)
> >
> > diff --git a/bindings/cxx/tests/tests-chip.cpp b/bindings/cxx/tests/tests-chip.cpp
> > index 11c2d4c..c9eb8e5 100644
> > --- a/bindings/cxx/tests/tests-chip.cpp
> > +++ b/bindings/cxx/tests/tests-chip.cpp
> > @@ -107,7 +107,7 @@ TEST_CASE("Uninitialized GPIO chip behaves correctly", "[chip]")
> >
> >         SECTION("using uninitialized chip throws logic_error")
> >         {
> > -               REQUIRE_THROWS_AS(chip.name(), ::std::logic_error&);
> > +               REQUIRE_THROWS_AS(chip.name(), ::std::logic_error);
> >         }
> >  }
> >
> > @@ -139,7 +139,7 @@ TEST_CASE("GPIO chip can be opened with the open() method with implicit lookup",
> >
> >  TEST_CASE("Trying to open a nonexistent chip throws system_error", "[chip]")
> >  {
> > -       REQUIRE_THROWS_AS(::gpiod::chip("nonexistent-chip"), ::std::system_error&);
> > +       REQUIRE_THROWS_AS(::gpiod::chip("nonexistent-chip"), ::std::system_error);
> >  }
> >
> >  TEST_CASE("Chip object can be reset", "[chip]")
> > @@ -244,12 +244,12 @@ TEST_CASE("Errors occurring when retrieving lines are correctly reported", "[chi
> >
> >         SECTION("invalid offset (single line)")
> >         {
> > -               REQUIRE_THROWS_AS(chip.get_line(9), ::std::out_of_range&);
> > +               REQUIRE_THROWS_AS(chip.get_line(9), ::std::out_of_range);
> >         }
> >
> >         SECTION("invalid offset (multiple lines)")
> >         {
> > -               REQUIRE_THROWS_AS(chip.get_lines({ 1, 19, 4, 7 }), ::std::out_of_range&);
> > +               REQUIRE_THROWS_AS(chip.get_lines({ 1, 19, 4, 7 }), ::std::out_of_range);
> >         }
> >
> >         SECTION("line not found by name")
> > diff --git a/bindings/cxx/tests/tests-event.cpp b/bindings/cxx/tests/tests-event.cpp
> > index b34347f..b41cf7e 100644
> > --- a/bindings/cxx/tests/tests-event.cpp
> > +++ b/bindings/cxx/tests/tests-event.cpp
> > @@ -149,7 +149,7 @@ TEST_CASE("It's possible to retrieve the event file descriptor", "[event][line]"
> >
> >         SECTION("error if not requested")
> >         {
> > -               REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error&);
> > +               REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error);
> >         }
> >
> >         SECTION("error if requested for values")
> > @@ -157,7 +157,7 @@ TEST_CASE("It's possible to retrieve the event file descriptor", "[event][line]"
> >                 config.request_type = ::gpiod::line_request::DIRECTION_INPUT;
> >
> >                 line.request(config);
> > -               REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error&);
> > +               REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error);
> >         }
> >  }
> >
> > diff --git a/bindings/cxx/tests/tests-line.cpp b/bindings/cxx/tests/tests-line.cpp
> > index e827e60..08ff1e8 100644
> > --- a/bindings/cxx/tests/tests-line.cpp
> > +++ b/bindings/cxx/tests/tests-line.cpp
> > @@ -122,7 +122,7 @@ TEST_CASE("Line bulk object works correctly", "[line][bulk]")
> >         {
> >                 auto lines = chip.get_all_lines();
> >
> > -               REQUIRE_THROWS_AS(lines.get(11), ::std::out_of_range&);
> > +               REQUIRE_THROWS_AS(lines.get(11), ::std::out_of_range);
> >         }
> >  }
> >
> > @@ -242,7 +242,7 @@ TEST_CASE("Exported line can be released", "[line]")
> >         line.release();
> >
> >         REQUIRE_FALSE(line.is_requested());
> > -       REQUIRE_THROWS_AS(line.get_value(), ::std::system_error&);
> > +       REQUIRE_THROWS_AS(line.get_value(), ::std::system_error);
> >  }
> >
> >  TEST_CASE("Uninitialized GPIO line behaves correctly", "[line]")
> > @@ -256,7 +256,7 @@ TEST_CASE("Uninitialized GPIO line behaves correctly", "[line]")
> >
> >         SECTION("using uninitialized line throws logic_error")
> >         {
> > -               REQUIRE_THROWS_AS(line.name(), ::std::logic_error&);
> > +               REQUIRE_THROWS_AS(line.name(), ::std::logic_error);
> >         }
> >  }
> >
> > @@ -271,7 +271,7 @@ TEST_CASE("Uninitialized GPIO line_bulk behaves correctly", "[line][bulk]")
> >
> >         SECTION("using uninitialized line_bulk throws logic_error")
> >         {
> > -               REQUIRE_THROWS_AS(bulk.get(0), ::std::logic_error&);
> > +               REQUIRE_THROWS_AS(bulk.get(0), ::std::logic_error);
> >         }
> >  }
> >
> > @@ -289,7 +289,7 @@ TEST_CASE("Cannot request the same line twice", "[line]")
> >                 auto line = chip.get_line(3);
> >
> >                 REQUIRE_NOTHROW(line.request(config));
> > -               REQUIRE_THROWS_AS(line.request(config), ::std::system_error&);
> > +               REQUIRE_THROWS_AS(line.request(config), ::std::system_error);
> >         }
> >
> >         SECTION("request the same line twice in line_bulk")
> > @@ -300,7 +300,7 @@ TEST_CASE("Cannot request the same line twice", "[line]")
> >                  */
> >                 auto lines = chip.get_lines({ 2, 3, 4, 4 });
> >
> > -               REQUIRE_THROWS_AS(lines.request(config), ::std::system_error&);
> > +               REQUIRE_THROWS_AS(lines.request(config), ::std::system_error);
> >         }
> >  }
> >
> > @@ -312,12 +312,12 @@ TEST_CASE("Cannot get/set values of unrequested lines", "[line]")
> >
> >         SECTION("get value")
> >         {
> > -               REQUIRE_THROWS_AS(line.get_value(), ::std::system_error&);
> > +               REQUIRE_THROWS_AS(line.get_value(), ::std::system_error);
> >         }
> >
> >         SECTION("set value")
> >         {
> > -               REQUIRE_THROWS_AS(line.set_value(1), ::std::system_error&);
> > +               REQUIRE_THROWS_AS(line.set_value(1), ::std::system_error);
> >         }
> >  }
> >
> > --
> > 2.22.0
> >

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [libgpiod] [PATCH 5/5] bindings: cxx: Workaround --success run
  2019-08-08 15:27   ` Bartosz Golaszewski
@ 2019-08-08 18:41     ` Alexander Stein
  2019-08-09  6:55       ` Bartosz Golaszewski
  0 siblings, 1 reply; 10+ messages in thread
From: Alexander Stein @ 2019-08-08 18:41 UTC (permalink / raw)
  To: Bartosz Golaszewski; +Cc: open list:GPIO SUBSYSTEM

 On Thursday, August 8, 2019, 5:27:14 PM CEST Bartosz Golaszewski wrote:
> śr., 7 sie 2019 o 21:51 Alexander Stein <alexander.stein@mailbox.org>
> napisał(a):
> >
> > If run with --success, all expressions are evaluated and printed out.
> > But REQUIRE_FALSE(chip) tries to iterate over the chip resulting in this
> > backtrace:
> > #0  gpiod_chip_num_lines (chip=chip@entry=0x0) at ../../lib/core.c:235
> > #1  gpiod_line_iter_new (chip=0x0) at ../../lib/iter.c:140
> > #2  gpiod::(anonymous namespace)::make_line_iter (chip=0x0) at ../../../bindings/cxx/iter.cpp:29
> > #3  gpiod::line_iter::line_iter (this=0x7fffffffd690, owner=...) at ../../../bindings/cxx/iter.cpp:109
> > #4  Catch::rangeToString<gpiod::chip> (range=...) at /usr/include/catch2/catch.hpp:1959
> > [...]
> >
> > Workaround by forcing catch2 to call gpiod::chip::operator bool().
> >
> > Signed-off-by: Alexander Stein <alexander.stein@mailbox.org>
> > ---
> > This actually looks like a flaw in the binding itself that the
> > gpiod::line_iter can't cope with an empty gpiod::chip.
> >
> 
> Do you want to submit a patch that fixes that? Otherwise I can fix it.
> I think that simply throwing an exception on empty chip is enough,
> right?

Reading that backtrace today, the actual problem is gpiod_chip_num_lines deferencing the nullptr.
There are 2 possibilities:
* if gpiod_chip is NULL in gpiod_line_iter_new(), return NULLL iter as well (which will raise an exception on line iter.cpp:31)
* return an iter with num_lines = 0

Can't rate the 2nd one if this will raise other problems.

Best regards,
Alexander




^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [libgpiod] [PATCH 5/5] bindings: cxx: Workaround --success run
  2019-08-08 18:41     ` Alexander Stein
@ 2019-08-09  6:55       ` Bartosz Golaszewski
  0 siblings, 0 replies; 10+ messages in thread
From: Bartosz Golaszewski @ 2019-08-09  6:55 UTC (permalink / raw)
  To: Alexander Stein; +Cc: open list:GPIO SUBSYSTEM

czw., 8 sie 2019 o 20:41 Alexander Stein <alexander.stein@mailbox.org>
napisał(a):
>
>  On Thursday, August 8, 2019, 5:27:14 PM CEST Bartosz Golaszewski wrote:
> > śr., 7 sie 2019 o 21:51 Alexander Stein <alexander.stein@mailbox.org>
> > napisał(a):
> > >
> > > If run with --success, all expressions are evaluated and printed out.
> > > But REQUIRE_FALSE(chip) tries to iterate over the chip resulting in this
> > > backtrace:
> > > #0  gpiod_chip_num_lines (chip=chip@entry=0x0) at ../../lib/core.c:235
> > > #1  gpiod_line_iter_new (chip=0x0) at ../../lib/iter.c:140
> > > #2  gpiod::(anonymous namespace)::make_line_iter (chip=0x0) at ../../../bindings/cxx/iter.cpp:29
> > > #3  gpiod::line_iter::line_iter (this=0x7fffffffd690, owner=...) at ../../../bindings/cxx/iter.cpp:109
> > > #4  Catch::rangeToString<gpiod::chip> (range=...) at /usr/include/catch2/catch.hpp:1959
> > > [...]
> > >
> > > Workaround by forcing catch2 to call gpiod::chip::operator bool().
> > >
> > > Signed-off-by: Alexander Stein <alexander.stein@mailbox.org>
> > > ---
> > > This actually looks like a flaw in the binding itself that the
> > > gpiod::line_iter can't cope with an empty gpiod::chip.
> > >
> >
> > Do you want to submit a patch that fixes that? Otherwise I can fix it.
> > I think that simply throwing an exception on empty chip is enough,
> > right?
>
> Reading that backtrace today, the actual problem is gpiod_chip_num_lines deferencing the nullptr.
> There are 2 possibilities:
> * if gpiod_chip is NULL in gpiod_line_iter_new(), return NULLL iter as well (which will raise an exception on line iter.cpp:31)
> * return an iter with num_lines = 0
>
> Can't rate the 2nd one if this will raise other problems.
>
> Best regards,
> Alexander
>
>
>

Hardening of argument validation in the core library (checking of
NULL-pointers, etc.) has been on my TODO list for some time now. It
seems I'll finally have to do it.

Thanks for the patches, all applied!

Bartosz

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2019-08-09  6:56 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-07 19:51 [libgpiod] [PATCH 1/5] bindings: cxx: Use 'upstream' include path Alexander Stein
2019-08-07 19:51 ` [libgpiod] [PATCH 2/5] bindings: cxx: Try using pkg-config to detect catch2 Alexander Stein
2019-08-07 19:51 ` [libgpiod] [PATCH 3/5] bindings: cxx: Split out catch's main() Alexander Stein
2019-08-07 19:51 ` [libgpiod] [PATCH 4/5] bindings: cxx: Fix compile errors Alexander Stein
2019-08-08 15:25   ` Bartosz Golaszewski
2019-08-08 15:37     ` Bartosz Golaszewski
2019-08-07 19:51 ` [libgpiod] [PATCH 5/5] bindings: cxx: Workaround --success run Alexander Stein
2019-08-08 15:27   ` Bartosz Golaszewski
2019-08-08 18:41     ` Alexander Stein
2019-08-09  6:55       ` Bartosz Golaszewski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).