public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Thomas Schwinge <thomas@codesourcery.com>
To: <gcc-patches@gcc.gnu.org>, Jason Merrill <jason@redhat.com>,
	"Nathan Sidwell" <nathan@acm.org>
Cc: <libstdc++@gcc.gnu.org>, Jonathan Wakely <jwakely@redhat.com>
Subject: Skip a number of C++ test cases for '-fno-exceptions' testing (was: Support in the GCC(/C++) test suites for '-fno-exceptions')
Date: Thu, 15 Jun 2023 17:15:54 +0200	[thread overview]
Message-ID: <87wn04eoyd.fsf@euler.schwinge.homeip.net> (raw)
In-Reply-To: <CACb0b4kDiwp5nEY952rbLAKy7_+iJey71z3WNMUxahTaLQt6vA@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 5214 bytes --]

Hi!

On 2023-06-06T20:31:21+0100, Jonathan Wakely <jwakely@redhat.com> wrote:
> On Tue, 6 Jun 2023 at 20:14, Thomas Schwinge <thomas@codesourcery.com> wrote:
>> This issue comes up in context of me working on C++ support for GCN and
>> nvptx target.  Those targets shall default to '-fno-exceptions' -- or,
>> "in other words", '-fexceptions' is not supported.  (Details omitted
>> here.)
>>
>> It did seem clear to me that with such a configuration it'll be hard to
>> get clean test results.  Then I found code in
>> 'gcc/testsuite/lib/gcc-dg.exp:gcc-dg-prune':
>>
>>     # If exceptions are disabled, mark tests expecting exceptions to be enabled
>>     # as unsupported.
>>     if { ![check_effective_target_exceptions_enabled] } {
>>         if [regexp "(^|\n)\[^\n\]*: error: exception handling disabled" $text] {
>>             return "::unsupported::exception handling disabled"
>>         }
>>
>> ..., which, in a way, sounds as if the test suite generally is meant to
>> produce useful results for '-fno-exceptions', nice surprise!
>>
>> Running x86_64-pc-linux-gnu (not yet GCN, nvptx) 'make check' with:
>>
>>     RUNTESTFLAGS='--target_board=unix/-fno-exceptions\{,-m32\}'
>>
>> ..., I find that indeed this does work for a lot of test cases, where we
>> then get (random example):
>>
>>      PASS: g++.dg/coroutines/pr99710.C  (test for errors, line 23)
>>     -PASS: g++.dg/coroutines/pr99710.C (test for excess errors)
>>     +UNSUPPORTED: g++.dg/coroutines/pr99710.C: exception handling disabled
>>
>> ..., due to:
>>
>>      [...]/g++.dg/coroutines/pr99710.C: In function 'task my_coro()':
>>     +[...]/g++.dg/coroutines/pr99710.C:18:10: error: exception handling
>> disabled, use '-fexceptions' to enable
>>      [...]/g++.dg/coroutines/pr99710.C:23:7: error: await expressions are
>> not permitted in handlers
>>      compiler exited with status 1
>>
>> But, we're nowhere near clean test results: PASS -> FAIL as well as
>> XFAIL -> XPASS regressions, due to 'error: exception handling disabled'
>> precluding other diagnostics seems to be one major issue.
>>
>> Is there interest in me producing the obvious (?) changes to those test
>> cases, such that compiler g++ as well as target library libstdc++ test
>> results are reasonably clean?  (If you think that's all "wasted effort",
>> then I suppose I'll just locally ignore any FAILs/XPASSes/UNRESOLVEDs
>> that appear in combination with
>> 'UNSUPPORTED: [...]: exception handling disabled'.)
>
> I would welcome that for libstdc++. I do sometimes run the libstdc++ tests
> with "unusual" options, like -fno-exceptions and -fno-rtti (e.g. today I've
> been fixing FAILs that only happen with -fexcess-precision=standard). I
> just manually ignore the tests that fail for -fno-exceptions, but it would
> be great if they were automatically skipped as UNSUPPORTED.

Per your and my changes a few days ago, we've already got libstdc++
covered, with the sole exception of:

    PASS: 27_io/basic_ostream/inserters_arithmetic/pod/23875.cc (test for excess errors)
    [-PASS:-]{+FAIL:+} 27_io/basic_ostream/inserters_arithmetic/pod/23875.cc execution test

    terminate called after throwing an instance of 'std::bad_cast'
      what():  std::bad_cast

(Low priority for me.)

Not having heard anything contrary regarding the compiler side of things,
I've now been working on that, see below.

> We already have a handful of tests that use #if __cpp_exceptions to make
> those parts conditional on exception support.

Yes, that's an option not for all but certainly for some test cases.
(I'm not looking into that now -- but this may in fact be a good
beginner-level task, will add to <https://gcc.gnu.org/wiki/EasyHacks>).

>> Otherwise, a number of test cases need DejaGnu directives
>> conditionalized on 'target exceptions_enabled'.

Before I get to such things, even simpler: OK to push the attached
"Skip a number of C++ test cases for '-fno-exceptions' testing"?


>> (Or,
>> 'error: exception handling disabled' made a "really late" diagnostic, so
>> that it doesn't preclude other diagnostics?  I'll have a look.  Well,
>> maybe something like: in fact do not default to '-fno-exceptions', but
>> instead emit 'error: exception handling disabled' only if in a "really
>> late" pass we run into exceptions-related constructs that we cannot
>> support.  That'd also avoid PASS -> UNSUPPORTED "regressions" when
>> exception handling in fact gets optimized away, for example.  I like that
>> idea, conceptually -- but is it feasible to implement..?)
>
> IMHO just [...] using [an effective target keyword] in test
> selectors seems simpler, and doesn't require changes to the compiler, just
> the tests.

I still like the idea, but yes, I've mentally put it on file "for later"
(ha, ha, ha...) -- it doesn't seem obvious to implement.


Grüße
 Thomas


-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Skip-a-number-of-C-test-cases-for-fno-exceptions-tes.patch --]
[-- Type: text/x-diff, Size: 27888 bytes --]

From fb7847774109c47708bc0fe26270d89a0db8ae0b Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>
Date: Wed, 7 Jun 2023 14:14:44 +0200
Subject: [PATCH] Skip a number of C++ test cases for '-fno-exceptions' testing

Running 'make check' with: 'RUNTESTFLAGS=--target_board=unix/-fno-exceptions',
'error: exception handling disabled' is triggered for C++ 'throw' etc. usage,
and per 'gcc/testsuite/lib/gcc-dg.exp:gcc-dg-prune':

    # If exceptions are disabled, mark tests expecting exceptions to be enabled
    # as unsupported.
    if { ![check_effective_target_exceptions_enabled] } {
	if [regexp "(^|\n)\[^\n\]*: error: exception handling disabled" $text] {
	    return "::unsupported::exception handling disabled"
	}

..., which generally means:

    -PASS: [...] (test for excess errors)
    +UNSUPPORTED: [...]: exception handling disabled

However, if there are additional 'dg-error' etc. directives, these may regress
PASS -> FAIL (or similar) -- if their associated diagnostics are precluded by
'error: exception handling disabled'.  For example:

    PASS: g++.dg/cpp2a/explicit1.C    (test for errors, line 43)
    PASS: g++.dg/cpp2a/explicit1.C    (test for errors, line 47)
    [-PASS:-]{+FAIL:+} g++.dg/cpp2a/explicit1.C    (test for errors, line 50)
    [-PASS:-]{+FAIL:+} g++.dg/cpp2a/explicit1.C    (test for errors, line 51)
    PASS: g++.dg/cpp2a/explicit1.C    (test for errors, line 52)
    PASS: g++.dg/cpp2a/explicit1.C    (test for errors, line 53)
    PASS: g++.dg/cpp2a/explicit1.C    (test for errors, line 59)
    [-PASS:-]{+UNSUPPORTED:+} g++.dg/cpp2a/explicit1.C  [-(test for excess errors)-]{+: exception handling disabled+}

Specify 'dg-require-effective-target exceptions_enabled' for those test cases.

	gcc/testsuite/
	* g++.dg/coroutines/pr95616-0.C: Specify
	'dg-require-effective-target exceptions_enabled'.
	* g++.dg/coroutines/pr95616-1.C: Likewise.
	* g++.dg/coroutines/pr95616-2.C: Likewise.
	* g++.dg/coroutines/pr95616-3.C: Likewise.
	* g++.dg/coroutines/pr95616-4.C: Likewise.
	* g++.dg/coroutines/pr95616-5.C: Likewise.
	* g++.dg/coroutines/pr95616-6.C: Likewise.
	* g++.dg/cpp0x/catch1.C: Likewise.
	* g++.dg/cpp0x/constexpr-throw.C: Likewise.
	* g++.dg/cpp1y/constexpr-89785-2.C: Likewise.
	* g++.dg/cpp1y/constexpr-throw.C: Likewise.
	* g++.dg/cpp1y/pr79393-3.C: Likewise.
	* g++.dg/cpp2a/consteval-memfn1.C: Likewise.
	* g++.dg/cpp2a/consteval11.C: Likewise.
	* g++.dg/cpp2a/consteval9.C: Likewise.
	* g++.dg/cpp2a/explicit1.C: Likewise.
	* g++.dg/cpp2a/explicit2.C: Likewise.
	* g++.dg/cpp2a/explicit5.C: Likewise.
	* g++.dg/eh/builtin10.C: Likewise.
	* g++.dg/eh/builtin11.C: Likewise.
	* g++.dg/eh/builtin6.C: Likewise.
	* g++.dg/eh/builtin7.C: Likewise.
	* g++.dg/eh/builtin9.C: Likewise.
	* g++.dg/eh/dtor4.C: Likewise.
	* g++.dg/eh/pr42859.C: Likewise.
	* g++.dg/ext/stmtexpr25.C: Likewise.
	* g++.dg/ext/vla4.C: Likewise.
	* g++.dg/init/placement4.C: Likewise.
	* g++.dg/other/error32.C: Likewise.
	* g++.dg/parse/crash55.C: Likewise.
	* g++.dg/parse/pr31952-2.C: Likewise.
	* g++.dg/parse/pr31952-3.C: Likewise.
	* g++.dg/tm/noexcept-7.C: Likewise.
	* g++.dg/torture/pr43257.C: Likewise.
	* g++.dg/torture/pr56694.C: Likewise.
	* g++.dg/torture/pr81659.C: Likewise.
	* g++.dg/warn/Wcatch-value-1.C: Likewise.
	* g++.dg/warn/Wcatch-value-2.C: Likewise.
	* g++.dg/warn/Wcatch-value-3.C: Likewise.
	* g++.dg/warn/Wcatch-value-3b.C: Likewise.
	* g++.dg/warn/Wexceptions1.C: Likewise.
	* g++.dg/warn/Wexceptions3.C: Likewise.
	* g++.dg/warn/Winfinite-recursion-3.C: Likewise.
	* g++.dg/warn/Wreturn-6.C: Likewise.
	* g++.dg/warn/Wstringop-truncation-2.C: Likewise.
	* g++.dg/warn/Wterminate1.C: Likewise.
	* g++.old-deja/g++.eh/catch1.C: Likewise.
	* g++.old-deja/g++.eh/catch10.C: Likewise.
	* g++.old-deja/g++.eh/cond1.C: Likewise.
	* g++.old-deja/g++.eh/ctor1.C: Likewise.
	* g++.old-deja/g++.eh/throw2.C: Likewise.
	* g++.old-deja/g++.other/cond5.C: Likewise.
---
 gcc/testsuite/g++.dg/coroutines/pr95616-0.C        | 1 +
 gcc/testsuite/g++.dg/coroutines/pr95616-1.C        | 1 +
 gcc/testsuite/g++.dg/coroutines/pr95616-2.C        | 1 +
 gcc/testsuite/g++.dg/coroutines/pr95616-3.C        | 1 +
 gcc/testsuite/g++.dg/coroutines/pr95616-4.C        | 1 +
 gcc/testsuite/g++.dg/coroutines/pr95616-5.C        | 1 +
 gcc/testsuite/g++.dg/coroutines/pr95616-6.C        | 1 +
 gcc/testsuite/g++.dg/cpp0x/catch1.C                | 1 +
 gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C       | 1 +
 gcc/testsuite/g++.dg/cpp1y/constexpr-89785-2.C     | 1 +
 gcc/testsuite/g++.dg/cpp1y/constexpr-throw.C       | 1 +
 gcc/testsuite/g++.dg/cpp1y/pr79393-3.C             | 1 +
 gcc/testsuite/g++.dg/cpp2a/consteval-memfn1.C      | 1 +
 gcc/testsuite/g++.dg/cpp2a/consteval11.C           | 1 +
 gcc/testsuite/g++.dg/cpp2a/consteval9.C            | 1 +
 gcc/testsuite/g++.dg/cpp2a/explicit1.C             | 1 +
 gcc/testsuite/g++.dg/cpp2a/explicit2.C             | 1 +
 gcc/testsuite/g++.dg/cpp2a/explicit5.C             | 1 +
 gcc/testsuite/g++.dg/eh/builtin10.C                | 1 +
 gcc/testsuite/g++.dg/eh/builtin11.C                | 1 +
 gcc/testsuite/g++.dg/eh/builtin6.C                 | 1 +
 gcc/testsuite/g++.dg/eh/builtin7.C                 | 1 +
 gcc/testsuite/g++.dg/eh/builtin9.C                 | 1 +
 gcc/testsuite/g++.dg/eh/dtor4.C                    | 2 ++
 gcc/testsuite/g++.dg/eh/pr42859.C                  | 1 +
 gcc/testsuite/g++.dg/ext/stmtexpr25.C              | 1 +
 gcc/testsuite/g++.dg/ext/vla4.C                    | 1 +
 gcc/testsuite/g++.dg/init/placement4.C             | 2 ++
 gcc/testsuite/g++.dg/other/error32.C               | 1 +
 gcc/testsuite/g++.dg/parse/crash55.C               | 2 ++
 gcc/testsuite/g++.dg/parse/pr31952-2.C             | 2 ++
 gcc/testsuite/g++.dg/parse/pr31952-3.C             | 2 ++
 gcc/testsuite/g++.dg/tm/noexcept-7.C               | 1 +
 gcc/testsuite/g++.dg/torture/pr43257.C             | 1 +
 gcc/testsuite/g++.dg/torture/pr56694.C             | 1 +
 gcc/testsuite/g++.dg/torture/pr81659.C             | 1 +
 gcc/testsuite/g++.dg/warn/Wcatch-value-1.C         | 1 +
 gcc/testsuite/g++.dg/warn/Wcatch-value-2.C         | 1 +
 gcc/testsuite/g++.dg/warn/Wcatch-value-3.C         | 1 +
 gcc/testsuite/g++.dg/warn/Wcatch-value-3b.C        | 1 +
 gcc/testsuite/g++.dg/warn/Wexceptions1.C           | 2 ++
 gcc/testsuite/g++.dg/warn/Wexceptions3.C           | 2 ++
 gcc/testsuite/g++.dg/warn/Winfinite-recursion-3.C  | 1 +
 gcc/testsuite/g++.dg/warn/Wreturn-6.C              | 2 ++
 gcc/testsuite/g++.dg/warn/Wstringop-truncation-2.C | 1 +
 gcc/testsuite/g++.dg/warn/Wterminate1.C            | 1 +
 gcc/testsuite/g++.old-deja/g++.eh/catch1.C         | 1 +
 gcc/testsuite/g++.old-deja/g++.eh/catch10.C        | 1 +
 gcc/testsuite/g++.old-deja/g++.eh/cond1.C          | 1 +
 gcc/testsuite/g++.old-deja/g++.eh/ctor1.C          | 2 ++
 gcc/testsuite/g++.old-deja/g++.eh/throw2.C         | 1 +
 gcc/testsuite/g++.old-deja/g++.other/cond5.C       | 1 +
 52 files changed, 61 insertions(+)

diff --git a/gcc/testsuite/g++.dg/coroutines/pr95616-0.C b/gcc/testsuite/g++.dg/coroutines/pr95616-0.C
index e500b6ea636..3d0cc59fbb8 100644
--- a/gcc/testsuite/g++.dg/coroutines/pr95616-0.C
+++ b/gcc/testsuite/g++.dg/coroutines/pr95616-0.C
@@ -1,3 +1,4 @@
+//  { dg-require-effective-target exceptions_enabled }
 //  { dg-additional-options "-fsyntax-only" }
 
 #if __has_include(<coroutine>)
diff --git a/gcc/testsuite/g++.dg/coroutines/pr95616-1.C b/gcc/testsuite/g++.dg/coroutines/pr95616-1.C
index c3989804e6b..2c7d7f2f6e8 100644
--- a/gcc/testsuite/g++.dg/coroutines/pr95616-1.C
+++ b/gcc/testsuite/g++.dg/coroutines/pr95616-1.C
@@ -1,3 +1,4 @@
+//  { dg-require-effective-target exceptions_enabled }
 //  { dg-additional-options "-fsyntax-only" }
 
 #if __has_include(<coroutine>)
diff --git a/gcc/testsuite/g++.dg/coroutines/pr95616-2.C b/gcc/testsuite/g++.dg/coroutines/pr95616-2.C
index 6ad251986ec..671a3f30a3a 100644
--- a/gcc/testsuite/g++.dg/coroutines/pr95616-2.C
+++ b/gcc/testsuite/g++.dg/coroutines/pr95616-2.C
@@ -1,3 +1,4 @@
+//  { dg-require-effective-target exceptions_enabled }
 //  { dg-additional-options "-fsyntax-only" }
 
 #if __has_include(<coroutine>)
diff --git a/gcc/testsuite/g++.dg/coroutines/pr95616-3.C b/gcc/testsuite/g++.dg/coroutines/pr95616-3.C
index 7da1f6a9658..e650d89e92a 100644
--- a/gcc/testsuite/g++.dg/coroutines/pr95616-3.C
+++ b/gcc/testsuite/g++.dg/coroutines/pr95616-3.C
@@ -1,3 +1,4 @@
+//  { dg-require-effective-target exceptions_enabled }
 //  { dg-additional-options "-fsyntax-only" }
 
 #if __has_include(<coroutine>)
diff --git a/gcc/testsuite/g++.dg/coroutines/pr95616-4.C b/gcc/testsuite/g++.dg/coroutines/pr95616-4.C
index ef6a160a5c4..b783a9d338c 100644
--- a/gcc/testsuite/g++.dg/coroutines/pr95616-4.C
+++ b/gcc/testsuite/g++.dg/coroutines/pr95616-4.C
@@ -1,3 +1,4 @@
+//  { dg-require-effective-target exceptions_enabled }
 //  { dg-additional-options "-fsyntax-only" }
 
 #if __has_include(<coroutine>)
diff --git a/gcc/testsuite/g++.dg/coroutines/pr95616-5.C b/gcc/testsuite/g++.dg/coroutines/pr95616-5.C
index 930c1a7e6a1..f7602bc593a 100644
--- a/gcc/testsuite/g++.dg/coroutines/pr95616-5.C
+++ b/gcc/testsuite/g++.dg/coroutines/pr95616-5.C
@@ -1,3 +1,4 @@
+//  { dg-require-effective-target exceptions_enabled }
 //  { dg-additional-options "-fsyntax-only" }
 
 #if __has_include(<coroutine>)
diff --git a/gcc/testsuite/g++.dg/coroutines/pr95616-6.C b/gcc/testsuite/g++.dg/coroutines/pr95616-6.C
index e7481711c5e..e535cc9a7d7 100644
--- a/gcc/testsuite/g++.dg/coroutines/pr95616-6.C
+++ b/gcc/testsuite/g++.dg/coroutines/pr95616-6.C
@@ -1,3 +1,4 @@
+//  { dg-require-effective-target exceptions_enabled }
 //  { dg-additional-options "-fsyntax-only" }
 
 #if __has_include(<coroutine>)
diff --git a/gcc/testsuite/g++.dg/cpp0x/catch1.C b/gcc/testsuite/g++.dg/cpp0x/catch1.C
index 81778ea7807..18ff3679a58 100644
--- a/gcc/testsuite/g++.dg/cpp0x/catch1.C
+++ b/gcc/testsuite/g++.dg/cpp0x/catch1.C
@@ -1,5 +1,6 @@
 // PR c++/53371
 // { dg-do compile { target c++11 } }
+// { dg-require-effective-target exceptions_enabled }
 
 struct Abs
 {
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C
index 5666629acae..640f798a154 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C
@@ -1,4 +1,5 @@
 // { dg-do compile { target c++11 } }
+// { dg-require-effective-target exceptions_enabled }
 
 constexpr int may_throw(bool decide) {
 	return decide ? 42 : throw -1; // { dg-error "throw" }
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-89785-2.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-89785-2.C
index 7afd9d24e98..c7fdf678aaf 100644
--- a/gcc/testsuite/g++.dg/cpp1y/constexpr-89785-2.C
+++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-89785-2.C
@@ -1,5 +1,6 @@
 // PR c++/89785
 // { dg-do compile { target c++14 } }
+// { dg-require-effective-target exceptions_enabled }
 
 constexpr int
 foo (int x)
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-throw.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-throw.C
index 35928744686..305a87b9a78 100644
--- a/gcc/testsuite/g++.dg/cpp1y/constexpr-throw.C
+++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-throw.C
@@ -1,4 +1,5 @@
 // { dg-do compile { target c++14 } }
+// { dg-require-effective-target exceptions_enabled }
 
 constexpr void f1() {
   if (false)
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr79393-3.C b/gcc/testsuite/g++.dg/cpp1y/pr79393-3.C
index 3c73cbbb659..8568d03856d 100644
--- a/gcc/testsuite/g++.dg/cpp1y/pr79393-3.C
+++ b/gcc/testsuite/g++.dg/cpp1y/pr79393-3.C
@@ -1,5 +1,6 @@
 // pr c++/79393
 // { dg-do compile { target c++14 } }
+// { dg-require-effective-target exceptions_enabled }
 
 struct A 
 {
diff --git a/gcc/testsuite/g++.dg/cpp2a/consteval-memfn1.C b/gcc/testsuite/g++.dg/cpp2a/consteval-memfn1.C
index 910e7a1ac1e..757ebac753c 100644
--- a/gcc/testsuite/g++.dg/cpp2a/consteval-memfn1.C
+++ b/gcc/testsuite/g++.dg/cpp2a/consteval-memfn1.C
@@ -1,5 +1,6 @@
 // PR c++/99895
 // { dg-do compile { target c++20 } }
+// { dg-require-effective-target exceptions_enabled }
 
 struct fixed_string {
   consteval int size(int n) const {
diff --git a/gcc/testsuite/g++.dg/cpp2a/consteval11.C b/gcc/testsuite/g++.dg/cpp2a/consteval11.C
index 2f68ec0f892..40694cef4ba 100644
--- a/gcc/testsuite/g++.dg/cpp2a/consteval11.C
+++ b/gcc/testsuite/g++.dg/cpp2a/consteval11.C
@@ -1,4 +1,5 @@
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-std=c++2a" }
 
 consteval int bar (int i) { if (i != 1) throw 1; return 0; }	// { dg-error "is not a constant expression" }
diff --git a/gcc/testsuite/g++.dg/cpp2a/consteval9.C b/gcc/testsuite/g++.dg/cpp2a/consteval9.C
index 489286a12d2..36ab3d7ee84 100644
--- a/gcc/testsuite/g++.dg/cpp2a/consteval9.C
+++ b/gcc/testsuite/g++.dg/cpp2a/consteval9.C
@@ -1,4 +1,5 @@
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-std=c++2a" }
 
 consteval int bar (int i) { if (i != 1) throw 1; return 0; }	// { dg-error "is not a constant expression" }
diff --git a/gcc/testsuite/g++.dg/cpp2a/explicit1.C b/gcc/testsuite/g++.dg/cpp2a/explicit1.C
index b39f90f3397..d7e1f3fb1db 100644
--- a/gcc/testsuite/g++.dg/cpp2a/explicit1.C
+++ b/gcc/testsuite/g++.dg/cpp2a/explicit1.C
@@ -1,5 +1,6 @@
 // P0892R2
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-std=c++2a" }
 
 constexpr int fn0 () { return 0; }
diff --git a/gcc/testsuite/g++.dg/cpp2a/explicit2.C b/gcc/testsuite/g++.dg/cpp2a/explicit2.C
index 7d1748c0f5e..d0f001af177 100644
--- a/gcc/testsuite/g++.dg/cpp2a/explicit2.C
+++ b/gcc/testsuite/g++.dg/cpp2a/explicit2.C
@@ -1,5 +1,6 @@
 // P0892R2
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-std=c++2a" }
 
 int foo() { return 42; }
diff --git a/gcc/testsuite/g++.dg/cpp2a/explicit5.C b/gcc/testsuite/g++.dg/cpp2a/explicit5.C
index 70a106f1fcb..ae4c7cab2ea 100644
--- a/gcc/testsuite/g++.dg/cpp2a/explicit5.C
+++ b/gcc/testsuite/g++.dg/cpp2a/explicit5.C
@@ -1,5 +1,6 @@
 // P0892R2
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-std=c++2a" }
 
 constexpr int fn0 () { return 0; }
diff --git a/gcc/testsuite/g++.dg/eh/builtin10.C b/gcc/testsuite/g++.dg/eh/builtin10.C
index 6c34f1f6d5c..f09291aebda 100644
--- a/gcc/testsuite/g++.dg/eh/builtin10.C
+++ b/gcc/testsuite/g++.dg/eh/builtin10.C
@@ -1,5 +1,6 @@
 // PR c++/88482
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 
 extern "C" void __cxa_throw (void *, void *, void (*) (void *));
 extern "C" float __cxa_get_exception_ptr (void *) throw ();	// { dg-message "previous declaration" }
diff --git a/gcc/testsuite/g++.dg/eh/builtin11.C b/gcc/testsuite/g++.dg/eh/builtin11.C
index abc8c1af535..04376d3c36a 100644
--- a/gcc/testsuite/g++.dg/eh/builtin11.C
+++ b/gcc/testsuite/g++.dg/eh/builtin11.C
@@ -1,5 +1,6 @@
 // PR c++/88482
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 
 extern "C" void __cxa_throw (float, void *, void (*) (void *));	// { dg-message "previous declaration" }
 extern "C" void *__cxa_get_exception_ptr (void *) throw ();
diff --git a/gcc/testsuite/g++.dg/eh/builtin6.C b/gcc/testsuite/g++.dg/eh/builtin6.C
index c05abdc8f51..3cc56510e0e 100644
--- a/gcc/testsuite/g++.dg/eh/builtin6.C
+++ b/gcc/testsuite/g++.dg/eh/builtin6.C
@@ -1,5 +1,6 @@
 // PR c++/88482
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 
 float __cxa_throw;		// { dg-message "previous declaration" }
 extern "C" void *__cxa_get_exception_ptr (void *);
diff --git a/gcc/testsuite/g++.dg/eh/builtin7.C b/gcc/testsuite/g++.dg/eh/builtin7.C
index 0ef279d09c1..5c79e2a2261 100644
--- a/gcc/testsuite/g++.dg/eh/builtin7.C
+++ b/gcc/testsuite/g++.dg/eh/builtin7.C
@@ -1,5 +1,6 @@
 // PR c++/88482
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 
 extern "C" void __cxa_throw (void *, void *, void (*) (void *));
 int __cxa_get_exception_ptr;		// { dg-message "previous declaration" }
diff --git a/gcc/testsuite/g++.dg/eh/builtin9.C b/gcc/testsuite/g++.dg/eh/builtin9.C
index 591a622630c..4e6ad073cbf 100644
--- a/gcc/testsuite/g++.dg/eh/builtin9.C
+++ b/gcc/testsuite/g++.dg/eh/builtin9.C
@@ -1,5 +1,6 @@
 // PR c++/88482
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 
 extern "C" int __cxa_throw (void *, void *, void (*) (void *));	// { dg-message "previous declaration" }
 extern "C" void *__cxa_get_exception_ptr (void *) throw ();
diff --git a/gcc/testsuite/g++.dg/eh/dtor4.C b/gcc/testsuite/g++.dg/eh/dtor4.C
index 6c0e804fe8a..0086121e45a 100644
--- a/gcc/testsuite/g++.dg/eh/dtor4.C
+++ b/gcc/testsuite/g++.dg/eh/dtor4.C
@@ -1,5 +1,7 @@
 // PR c++/109172
 
+// { dg-require-effective-target exceptions_enabled }
+
 class Demo
 {
   ~Demo();
diff --git a/gcc/testsuite/g++.dg/eh/pr42859.C b/gcc/testsuite/g++.dg/eh/pr42859.C
index 0de91409c83..8d3f429c628 100644
--- a/gcc/testsuite/g++.dg/eh/pr42859.C
+++ b/gcc/testsuite/g++.dg/eh/pr42859.C
@@ -1,4 +1,5 @@
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 
 void start (void);
 void
diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr25.C b/gcc/testsuite/g++.dg/ext/stmtexpr25.C
index 79c40fc61c4..856f7d29e59 100644
--- a/gcc/testsuite/g++.dg/ext/stmtexpr25.C
+++ b/gcc/testsuite/g++.dg/ext/stmtexpr25.C
@@ -1,6 +1,7 @@
 // PR c++/81073
 // { dg-options "" }
 // { dg-do compile { target c++11 } }
+// { dg-require-effective-target exceptions_enabled }
 
 struct test { const int *addr; };
 
diff --git a/gcc/testsuite/g++.dg/ext/vla4.C b/gcc/testsuite/g++.dg/ext/vla4.C
index e96f2735f8a..c2339359c4f 100644
--- a/gcc/testsuite/g++.dg/ext/vla4.C
+++ b/gcc/testsuite/g++.dg/ext/vla4.C
@@ -1,4 +1,5 @@
 // PR c++/29318
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "" }
 
 #include <typeinfo>
diff --git a/gcc/testsuite/g++.dg/init/placement4.C b/gcc/testsuite/g++.dg/init/placement4.C
index 3cfe27d63e6..912fc1d03f8 100644
--- a/gcc/testsuite/g++.dg/init/placement4.C
+++ b/gcc/testsuite/g++.dg/init/placement4.C
@@ -1,5 +1,7 @@
 // PR c++/34158
 
+// { dg-require-effective-target exceptions_enabled }
+
 typedef __SIZE_TYPE__ size_t;
 extern "C" void* malloc (size_t);
 extern "C" void free (void *);
diff --git a/gcc/testsuite/g++.dg/other/error32.C b/gcc/testsuite/g++.dg/other/error32.C
index 56d3b7aec8b..19a5a00a2e9 100644
--- a/gcc/testsuite/g++.dg/other/error32.C
+++ b/gcc/testsuite/g++.dg/other/error32.C
@@ -1,4 +1,5 @@
 // PR c++/33492
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "" }
 
 void foo()
diff --git a/gcc/testsuite/g++.dg/parse/crash55.C b/gcc/testsuite/g++.dg/parse/crash55.C
index 2e88c476fc7..30f7a50f9fa 100644
--- a/gcc/testsuite/g++.dg/parse/crash55.C
+++ b/gcc/testsuite/g++.dg/parse/crash55.C
@@ -1,5 +1,7 @@
 // PR c++/42038
 
+// { dg-require-effective-target exceptions_enabled }
+
 extern int __cxa_begin_catch;	// { dg-message "previous declaration" }
 
 void f(void)
diff --git a/gcc/testsuite/g++.dg/parse/pr31952-2.C b/gcc/testsuite/g++.dg/parse/pr31952-2.C
index f09bcab1b85..968aabc385c 100644
--- a/gcc/testsuite/g++.dg/parse/pr31952-2.C
+++ b/gcc/testsuite/g++.dg/parse/pr31952-2.C
@@ -1,5 +1,7 @@
 // PR c++/31952
 
+// { dg-require-effective-target exceptions_enabled }
+
 void
 f0()
 {
diff --git a/gcc/testsuite/g++.dg/parse/pr31952-3.C b/gcc/testsuite/g++.dg/parse/pr31952-3.C
index 9fe5f028378..92539a39a95 100644
--- a/gcc/testsuite/g++.dg/parse/pr31952-3.C
+++ b/gcc/testsuite/g++.dg/parse/pr31952-3.C
@@ -1,5 +1,7 @@
 // PR c++/31952
 
+// { dg-require-effective-target exceptions_enabled }
+
 int
 f0 (int bar)     // { dg-message "previously" }
 try
diff --git a/gcc/testsuite/g++.dg/tm/noexcept-7.C b/gcc/testsuite/g++.dg/tm/noexcept-7.C
index bfa675c987f..c3734e86c66 100644
--- a/gcc/testsuite/g++.dg/tm/noexcept-7.C
+++ b/gcc/testsuite/g++.dg/tm/noexcept-7.C
@@ -1,4 +1,5 @@
 // FIXME the TS says atomic_noexcept calls abort, not terminate.
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-fgnu-tm" }
 
 void f()
diff --git a/gcc/testsuite/g++.dg/torture/pr43257.C b/gcc/testsuite/g++.dg/torture/pr43257.C
index fab5f09c31a..633b7ec3465 100644
--- a/gcc/testsuite/g++.dg/torture/pr43257.C
+++ b/gcc/testsuite/g++.dg/torture/pr43257.C
@@ -1,4 +1,5 @@
 /* { dg-do assemble } */
+/* { dg-require-effective-target exceptions_enabled } */
 
 class A {};
 class B {};
diff --git a/gcc/testsuite/g++.dg/torture/pr56694.C b/gcc/testsuite/g++.dg/torture/pr56694.C
index 774bac4c615..dfaaf31c192 100644
--- a/gcc/testsuite/g++.dg/torture/pr56694.C
+++ b/gcc/testsuite/g++.dg/torture/pr56694.C
@@ -1,4 +1,5 @@
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-fopenmp" }
 // { dg-require-effective-target fopenmp }
 
diff --git a/gcc/testsuite/g++.dg/torture/pr81659.C b/gcc/testsuite/g++.dg/torture/pr81659.C
index 074099be6fc..e78483f88fe 100644
--- a/gcc/testsuite/g++.dg/torture/pr81659.C
+++ b/gcc/testsuite/g++.dg/torture/pr81659.C
@@ -1,4 +1,5 @@
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 
 void
 a (int b)
diff --git a/gcc/testsuite/g++.dg/warn/Wcatch-value-1.C b/gcc/testsuite/g++.dg/warn/Wcatch-value-1.C
index a84b337b939..9616024e0e9 100644
--- a/gcc/testsuite/g++.dg/warn/Wcatch-value-1.C
+++ b/gcc/testsuite/g++.dg/warn/Wcatch-value-1.C
@@ -1,3 +1,4 @@
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-Wcatch-value=1" }
 
 struct A { virtual ~A() {} };
diff --git a/gcc/testsuite/g++.dg/warn/Wcatch-value-2.C b/gcc/testsuite/g++.dg/warn/Wcatch-value-2.C
index e20719c155b..43f3e00472d 100644
--- a/gcc/testsuite/g++.dg/warn/Wcatch-value-2.C
+++ b/gcc/testsuite/g++.dg/warn/Wcatch-value-2.C
@@ -1,3 +1,4 @@
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-Wcatch-value=2" }
 
 struct A { virtual ~A() {} };
diff --git a/gcc/testsuite/g++.dg/warn/Wcatch-value-3.C b/gcc/testsuite/g++.dg/warn/Wcatch-value-3.C
index c91a3c08590..b48c989503d 100644
--- a/gcc/testsuite/g++.dg/warn/Wcatch-value-3.C
+++ b/gcc/testsuite/g++.dg/warn/Wcatch-value-3.C
@@ -1,3 +1,4 @@
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-Wcatch-value=3" }
 
 struct A { virtual ~A() {} };
diff --git a/gcc/testsuite/g++.dg/warn/Wcatch-value-3b.C b/gcc/testsuite/g++.dg/warn/Wcatch-value-3b.C
index cb9af4a6019..47ea4671ac1 100644
--- a/gcc/testsuite/g++.dg/warn/Wcatch-value-3b.C
+++ b/gcc/testsuite/g++.dg/warn/Wcatch-value-3b.C
@@ -1,3 +1,4 @@
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-Wcatch-value=3" }
 
 struct A { virtual ~A() {} };
diff --git a/gcc/testsuite/g++.dg/warn/Wexceptions1.C b/gcc/testsuite/g++.dg/warn/Wexceptions1.C
index af140fd0dc2..dd4c3252d39 100644
--- a/gcc/testsuite/g++.dg/warn/Wexceptions1.C
+++ b/gcc/testsuite/g++.dg/warn/Wexceptions1.C
@@ -1,5 +1,7 @@
 // PR c++/97675
 
+// { dg-require-effective-target exceptions_enabled }
+
 struct Base { };
 struct Child : Base { };
 int main() {
diff --git a/gcc/testsuite/g++.dg/warn/Wexceptions3.C b/gcc/testsuite/g++.dg/warn/Wexceptions3.C
index 97fda9dbd91..cd041ae248c 100644
--- a/gcc/testsuite/g++.dg/warn/Wexceptions3.C
+++ b/gcc/testsuite/g++.dg/warn/Wexceptions3.C
@@ -1,5 +1,7 @@
 // PR c++/81660
 
+// { dg-require-effective-target exceptions_enabled }
+
 void bar (int);
 
 void
diff --git a/gcc/testsuite/g++.dg/warn/Winfinite-recursion-3.C b/gcc/testsuite/g++.dg/warn/Winfinite-recursion-3.C
index 166e6d5790d..d4d76fba19f 100644
--- a/gcc/testsuite/g++.dg/warn/Winfinite-recursion-3.C
+++ b/gcc/testsuite/g++.dg/warn/Winfinite-recursion-3.C
@@ -1,5 +1,6 @@
 /* PR middle-end/88232 - Please implement -Winfinite-recursion
    { dg-do compile }
+   { dg-require-effective-target exceptions_enabled }
    { dg-options "-Wall -Winfinite-recursion" } */
 
 typedef __SIZE_TYPE__ size_t;
diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-6.C b/gcc/testsuite/g++.dg/warn/Wreturn-6.C
index 85fef0e16df..85a1f696f20 100644
--- a/gcc/testsuite/g++.dg/warn/Wreturn-6.C
+++ b/gcc/testsuite/g++.dg/warn/Wreturn-6.C
@@ -1,5 +1,7 @@
 // PR c++/107310
 
+// { dg-require-effective-target exceptions_enabled }
+
 struct f
 {
   ~f();
diff --git a/gcc/testsuite/g++.dg/warn/Wstringop-truncation-2.C b/gcc/testsuite/g++.dg/warn/Wstringop-truncation-2.C
index ebbd44307d9..f9062f7621b 100644
--- a/gcc/testsuite/g++.dg/warn/Wstringop-truncation-2.C
+++ b/gcc/testsuite/g++.dg/warn/Wstringop-truncation-2.C
@@ -3,6 +3,7 @@
 // Compile with -g to verify the warning deals properly with debug
 // statements.
 // { dg-do compile }
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-O2 -Wstringop-truncation -g" }
 
 extern "C" char* strncpy (char*, const char*, __SIZE_TYPE__);
diff --git a/gcc/testsuite/g++.dg/warn/Wterminate1.C b/gcc/testsuite/g++.dg/warn/Wterminate1.C
index affb48d3e8a..246555ca039 100644
--- a/gcc/testsuite/g++.dg/warn/Wterminate1.C
+++ b/gcc/testsuite/g++.dg/warn/Wterminate1.C
@@ -1,6 +1,7 @@
 // In C++98 mode this gets a -Wc++11-compat warning, in C++11 mode a
 // -Wterminate warning.
 
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-Wall" }
 
 struct A
diff --git a/gcc/testsuite/g++.old-deja/g++.eh/catch1.C b/gcc/testsuite/g++.old-deja/g++.eh/catch1.C
index 67779d945ea..68e2c745655 100644
--- a/gcc/testsuite/g++.old-deja/g++.eh/catch1.C
+++ b/gcc/testsuite/g++.old-deja/g++.eh/catch1.C
@@ -1,4 +1,5 @@
 // { dg-do assemble  }
+// { dg-require-effective-target exceptions_enabled }
 // 
 // Copyright (C) 1999 Free Software Foundation, Inc.
 // Contributed by Nathan Sidwell 6 Jun 1999 <nathan@acm.org>
diff --git a/gcc/testsuite/g++.old-deja/g++.eh/catch10.C b/gcc/testsuite/g++.old-deja/g++.eh/catch10.C
index 7cc609645a2..c085c9b39e0 100644
--- a/gcc/testsuite/g++.old-deja/g++.eh/catch10.C
+++ b/gcc/testsuite/g++.old-deja/g++.eh/catch10.C
@@ -1,4 +1,5 @@
 // { dg-do assemble  }
+// { dg-require-effective-target exceptions_enabled }
 // Test that we notice unfortunate handler ordering.
 
 struct A { };
diff --git a/gcc/testsuite/g++.old-deja/g++.eh/cond1.C b/gcc/testsuite/g++.old-deja/g++.eh/cond1.C
index fe6d4296ab5..a7fcf890099 100644
--- a/gcc/testsuite/g++.old-deja/g++.eh/cond1.C
+++ b/gcc/testsuite/g++.old-deja/g++.eh/cond1.C
@@ -1,4 +1,5 @@
 // { dg-do assemble  }
+// { dg-require-effective-target exceptions_enabled }
 
 // Copyright (C) 1999, 2000 Free Software Foundation, Inc.
 // Contributed by Nathan Sidwell 11 Apr 1999 <nathan@acm.org>
diff --git a/gcc/testsuite/g++.old-deja/g++.eh/ctor1.C b/gcc/testsuite/g++.old-deja/g++.eh/ctor1.C
index cc39ac3953f..b3b0ce2d00c 100644
--- a/gcc/testsuite/g++.old-deja/g++.eh/ctor1.C
+++ b/gcc/testsuite/g++.old-deja/g++.eh/ctor1.C
@@ -1,4 +1,6 @@
 // { dg-do assemble  }
+// { dg-require-effective-target exceptions_enabled }
+
 struct A
 {
   A();
diff --git a/gcc/testsuite/g++.old-deja/g++.eh/throw2.C b/gcc/testsuite/g++.old-deja/g++.eh/throw2.C
index 957c200f8af..b7acb6206b2 100644
--- a/gcc/testsuite/g++.old-deja/g++.eh/throw2.C
+++ b/gcc/testsuite/g++.old-deja/g++.eh/throw2.C
@@ -1,4 +1,5 @@
 // { dg-do assemble  }
+// { dg-require-effective-target exceptions_enabled }
 
 // Submitted by Sebastian Ritterbusch <uabp@rz.uni-karlsruhe.de>
 
diff --git a/gcc/testsuite/g++.old-deja/g++.other/cond5.C b/gcc/testsuite/g++.old-deja/g++.other/cond5.C
index 0d2baf9edf7..9474c35f252 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/cond5.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/cond5.C
@@ -1,4 +1,5 @@
 // { dg-do assemble  }
+// { dg-require-effective-target exceptions_enabled }
 // { dg-options "-W -pedantic -ansi" }
 
 // Copyright (C) 1999, 2000 Free Software Foundation, Inc.
-- 
2.34.1


  parent reply	other threads:[~2023-06-15 15:16 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <873534qu9e.fsf@euler.schwinge.homeip.net>
     [not found] ` <CACb0b4kDiwp5nEY952rbLAKy7_+iJey71z3WNMUxahTaLQt6vA@mail.gmail.com>
2023-06-07  7:13   ` Support 'UNSUPPORTED: [...]: exception handling disabled' for libstdc++ " Thomas Schwinge
2023-06-07  8:12     ` Jonathan Wakely
2023-06-07  9:08       ` Thomas Schwinge
2023-06-07 11:51         ` Jonathan Wakely
2023-06-07 15:56           ` Jonathan Wakely
2023-06-15 15:15   ` Thomas Schwinge [this message]
2023-06-15 15:47     ` Skip a number of C++ "split files" test cases for '-fno-exceptions' testing (was: Skip a number of C++ test cases for '-fno-exceptions' testing (was: Support in the GCC(/C++) test suites for '-fno-exceptions')) Thomas Schwinge
2023-11-03 11:08       ` Skip a number of 'g++.dg/compat/' test cases for '-fno-exceptions' testing (was: Skip a number of C++ "split files" test cases for '-fno-exceptions' testing (was: Skip a number of C++ test cases for '-fno-exceptions' testing (was: Support in the GCC(/C++) test suites for '-fno-exceptions'))) Thomas Schwinge
2023-11-03 11:10       ` Skip a number of 'g++.dg/lto/' " Thomas Schwinge
2023-06-15 16:04     ` Skip a number of C++ 'g++.dg/tree-prof/' test cases for '-fno-exceptions' testing (was: Skip a number of C++ test cases for '-fno-exceptions' testing (was: Support in the GCC(/C++) test suites for '-fno-exceptions')) Thomas Schwinge
2023-11-03 11:12       ` Skip a number of " Thomas Schwinge
2023-09-08 13:30     ` Skip a number of C++ test cases for '-fno-exceptions' testing (was: Support in the GCC(/C++) test suites for '-fno-exceptions') Thomas Schwinge
2023-11-03 11:03       ` Thomas Schwinge
2023-11-03 11:15         ` Jakub Jelinek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87wn04eoyd.fsf@euler.schwinge.homeip.net \
    --to=thomas@codesourcery.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jason@redhat.com \
    --cc=jwakely@redhat.com \
    --cc=libstdc++@gcc.gnu.org \
    --cc=nathan@acm.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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 read-only IMAP folder(s) and NNTP newsgroup(s).