[Bug libstdc++/113376] [14/15 Regression] Confusing notes when using C++17 parallel algorithms

2024-06-12 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113376

Jonathan Wakely  changed:

   What|Removed |Added

 Status|NEW |ASSIGNED
URL||https://gcc.gnu.org/piperma
   ||il/gcc-patches/2024-June/65
   ||4411.html
   Keywords||patch

--- Comment #7 from Jonathan Wakely  ---
Patch posted: https://gcc.gnu.org/pipermail/gcc-patches/2024-June/654411.html

[Bug libstdc++/37475] codecvt::do_in/do_out functions return "ok" when the output sequence has zero length

2024-06-12 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37475

Jonathan Wakely  changed:

   What|Removed |Added

 Status|NEW |ASSIGNED
   Assignee|unassigned at gcc dot gnu.org  |redi at gcc dot gnu.org
URL||https://gcc.gnu.org/piperma
   ||il/gcc-patches/2024-June/65
   ||4410.html
   Keywords||patch

--- Comment #13 from Jonathan Wakely  ---
Full patch: https://gcc.gnu.org/pipermail/gcc-patches/2024-June/654410.html

(In reply to Kristian Spangsege from comment #12)
> These changes look good to me.
> 
> A couple of points:
> * Should the `else`s still be there now that the preceding branches
> terminate with `break`?

Doesn't really matter either way.

> * `do_out()` has the same problem as `do_in()`.

Yes, addressed in the posted patch.

> * If there is already testing of `codecvt`, should a test be added for the
> "empty output" case?

Yes, addressed in the posted patch.

> * This could break code that expects the incorrect behavior.

That's true for every bug fix. We should conform to the standard though.

[Bug target/97367] powerpc64 g5 and cell optimizations result in .machine power7

2024-06-12 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97367

Jonathan Wakely  changed:

   What|Removed |Added

URL|https://gcc.gnu.org/piperma |https://gcc.gnu.org/piperma
   |il/gcc-patches/2020-Decembe |il/gcc-patches/2024-June/65
   |r/560994.html   |4217.html

--- Comment #8 from Jonathan Wakely  ---
Updated patch https://gcc.gnu.org/pipermail/gcc-patches/2024-June/654217.html

[Bug libstdc++/115399] std::tr2::dynamic_bitset shift behaves differently from std::bitset

2024-06-12 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115399

Jonathan Wakely  changed:

   What|Removed |Added

 Resolution|--- |FIXED
 Status|ASSIGNED|RESOLVED
   Target Milestone|--- |15.0

--- Comment #5 from Jonathan Wakely  ---
Fixed on trunk. I'll probably backport it to the release branches at some
point.

[Bug libstdc++/113376] [14/15 Regression] Confusing notes when using C++17 parallel algorithms

2024-06-12 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113376

Jonathan Wakely  changed:

   What|Removed |Added

  Known to fail||14.1.0, 15.0
  Known to work||13.3.0
   Assignee|unassigned at gcc dot gnu.org  |redi at gcc dot gnu.org
   Target Milestone|--- |14.2
Summary|Confusing notes when using  |[14/15 Regression]
   |C++17 parallel algorithms   |Confusing notes when using
   ||C++17 parallel algorithms

[Bug libstdc++/113376] Confusing notes when using C++17 parallel algorithms

2024-06-12 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113376

--- Comment #6 from Jonathan Wakely  ---
(In reply to Pilar Latiesa from comment #3)
> It seems that what is missing is a corresponding change in the macro
> definition logic. It should have been changed to:
> 
> // Check the user-defined macro for warnings
> #if defined(PSTL_USAGE_WARNINGS)
> #define _PSTL_USAGE_WARNINGS
> #endif
> 
> See
> https://github.com/llvm/llvm-project/blob/
> 5ccf19ded09f68bef43275c81c20b0e65f7c0b75/pstl/include/pstl/internal/
> pstl_config.h#L26

The upstream change breaks the previous API though.

It looks like users were able to define PSTL_USAGE_WARNINGS=0 or
PSTL_USAGE_WARNINGS=1 to request warnings to be off or on, respectively. But
the LLVM change means that it only matters whether it's defined or not. This
seems to have been a misguided change to make sure *all* macros are used with
#ifdef not #if. But that breaks the intended use for some of them.

So I think we should either revert the change later in the file which checks
_PSTL_USAGE_WARNINGS, or we should take the user-facing macro's value into
account when deciding whether to define it:

// Check the user-defined macro for warnings
#if defined(PSTL_USAGE_WARNINGS) && PSTL_USAGE_WARNINGS != 0
#define _PSTL_USAGE_WARNINGS
#endif

[Bug libstdc++/113376] Confusing notes when using C++17 parallel algorithms

2024-06-12 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113376

--- Comment #5 from Jonathan Wakely  ---
I think
https://github.com/llvm/llvm-project/commit/3b9a1bb1af90db9472340ef2122d3855eb9ba3fc#r142768040
is the real cause of the problem. They wanted to avoid -Wundef errors, so
changed all the macro tests to use #ifdef instead of #if

That is what requires a change to how _PSTL_USAGE_WARNINGS is defined. It also
caused other problems elsewhere downstream:
https://github.com/oneapi-src/oneDPL/issues/1602

[Bug driver/115440] unrecognized command-line option '--c++17'; did you mean '--stdc++17'?

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115440

--- Comment #2 from Jonathan Wakely  ---
People certainly do write --std, I see it all the time. I don't like it though.

[Bug libstdc++/100285] experimental/net/socket/socket_base.cc fails on arm-eabi (r12-137)

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100285

Jonathan Wakely  changed:

   What|Removed |Added

   Target Milestone|13.3|12.4

--- Comment #19 from Jonathan Wakely  ---
Fixed for 12.4 now anyway.

[Bug libstdc++/114367] std::vector constexpr initialization doesn't start lifetime of array members

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114367

Jonathan Wakely  changed:

   What|Removed |Added

 Resolution|--- |FIXED
 Status|ASSIGNED|RESOLVED

--- Comment #7 from Jonathan Wakely  ---
Fixed for 12.4 and 13.3

[Bug libstdc++/114359] std::binomial_distribution hangs in infinite loop

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114359

Jonathan Wakely  changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution|--- |FIXED

--- Comment #9 from Jonathan Wakely  ---
Also fixed for 12.4

[Bug libstdc++/37475] codecvt::do_in/do_out functions return "ok" when the output sequence has zero length

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37475

--- Comment #11 from Jonathan Wakely  ---
This changes the loop to always run if the input is non-empty, and so return
partial if the destination is empty.

--- a/libstdc++-v3/config/locale/gnu/codecvt_members.cc
+++ b/libstdc++-v3/config/locale/gnu/codecvt_members.cc
@@ -131,10 +131,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 // mbsnrtowcs is *very* fast but stops if encounters NUL characters:
 // in case we store a L'\0' and then continue, in a loop.
 // NB: mbsnrtowcs is a GNU extension
-for (__from_next = __from, __to_next = __to;
-__from_next < __from_end && __to_next < __to_end
-&& __ret == ok;)
+__from_next = __from;
+__to_next = __to;
+while (__from_next < __from_end)
   {
+   if (__to_next >= __to_end)
+ {
+   __ret = partial;
+   break;
+ }
+
const extern_type* __from_chunk_end;
__from_chunk_end = static_cast(memchr(__from_next,
'\0',
  __from_end
@@ -162,12 +168,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__from_next = __from;
__state = __tmp_state;
__ret = error;
+   break;
  }
else if (__from_next && __from_next < __from_chunk_end)
  {
// It is unclear what to return in this case (see DR 382).
__to_next += __conv;
__ret = partial;
+   break;
  }
else
  {
@@ -175,7 +183,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__to_next += __conv;
  }

-   if (__from_next < __from_end && __ret == ok)
+   if (__from_next < __from_end)
  {
if (__to_next < __to_end)
  {
@@ -185,7 +193,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
*__to_next++ = L'\0';
  }
else
- __ret = partial;
+ {
+   __ret = partial;
+   break;
+ }
  }
   }

[Bug libstdc++/37475] codecvt::do_in/do_out functions return "ok" when the output sequence has zero length

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37475

--- Comment #10 from Jonathan Wakely  ---
Whereas the GNU locale has that check inside a loop, which is never entered
when the destination buffer is zero sized, i.e. __to == __to_end

if (__from_next < __from_end && __ret == ok)
  {
if (__to_next < __to_end)
  {
// XXX Probably wrong for stateful encodings
__tmp_state = __state;
++__from_next;
*__to_next++ = L'\0';
  }
else
  __ret = partial;
  }

[Bug libstdc++/37475] codecvt::do_in/do_out functions return "ok" when the output sequence has zero length

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37475

--- Comment #9 from Jonathan Wakely  ---
(In reply to Kristian Spangsege from comment #7)
> Curiously, this bug does not occur when using the Cygwin or MinGW versions
> of GCC. In these cases, the result is `partial` as it should be. I assume
> this is because on Cygwin and MinGW, libstdc++ uses a generic locale
> implementation that is different from the one ordinarily used on Linux.

It has an explicit check for this condition:

// It is not clear that __from < __from_end implies __ret != ok
// (see DR 382).
if (__ret == ok && __from < __from_end)
  __ret = partial;

[Bug libstdc++/37475] [DR 382] codecvt::do_in/do_out functions return "ok" when the output sequence has zero length

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37475

Jonathan Wakely  changed:

   What|Removed |Added

 Status|SUSPENDED   |NEW

--- Comment #8 from Jonathan Wakely  ---
I assume you mean 14.1.0

Since 382 indeed doesn't seem relevant here, let's unsuspend this.

[Bug c++/59246] GCC should issue runtime error for calling pure virtual function with definition

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59246

Jonathan Wakely  changed:

   What|Removed |Added

   See Also||https://gcc.gnu.org/bugzill
   ||a/show_bug.cgi?id=115435
   Last reconfirmed|2021-11-10 00:00:00 |2024-6-11

--- Comment #4 from Jonathan Wakely  ---
On further thought, I think GCC's behaviour of calling the definition if one
exists is reasonable (possibly better than aborting the process by calling
__cxa_pure_virtual). But when UBsan is active we should diagnose it as
requested.

Clang doesn't seem to handle this in UBsan, it just always calls
__cxa_pure_virtual.

I stated in comment 2 that GCC does give a warning about this even if it
doesn't diagnose it at runtime. That's only true for a direct call, for
indirect calls to the pure virtual function there's no warning, see PR 115435

[Bug c++/115435] New: Issue warning for indirect call to pure virtual function in ctor or dtor

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115435

Bug ID: 115435
   Summary: Issue warning for indirect call to pure virtual
function in ctor or dtor
   Product: gcc
   Version: 15.0
Status: UNCONFIRMED
  Keywords: diagnostic
  Severity: normal
  Priority: P3
 Component: c++
  Assignee: unassigned at gcc dot gnu.org
  Reporter: redi at gcc dot gnu.org
Blocks: 87403
  Target Milestone: ---

We warn about undefined calls to pure virtual functions from constructors and
destructors:

struct Base {
virtual void f() = 0;
Base() { f(); }
};

: In constructor 'Base::Base()':
:3:15: warning: pure virtual 'virtual void Base::f()' called from
constructor
3 | Base() { f(); }
  |  ~^~


But for indirect calls we don't warn:

struct Base {
virtual void f() = 0;
Base() { g(); }
void g() { f(); }
};

It would be good if IPA could warn for this case too. After g() is inlined into
the constructor we know that the call to f() is undefined.

I assume this would mean moving the warning from the front end to the middle
end.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87403
[Bug 87403] [Meta-bug] Issues that suggest a new warning

[Bug libstdc++/115433] unexpected increase of testsuite execution time

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115433

--- Comment #2 from Jonathan Wakely  ---
I haven't noticed this myself because my ~/.dejagnurc contains:

if { [info exists v3-use-std-list] } {
  # v3-dg-runtest supports running tests with multiple -std options.
  set v3_std_list { 98 11 14 17 20 23 26 }
  set target_list {
"unix{-D_GLIBCXX_ASSERTIONS,-D_GLIBCXX_USE_CXX11_ABI=0,-m32}" }
} else {
  set target_list {
"unix{,-D_GLIBCXX_USE_CXX11_ABI=0,-std=gnu++2b,-std=gnu++11}" }
}

So I run all tests 21 times (seven -std options, each repeated for three target
boards).

[Bug libstdc++/115433] unexpected increase of testsuite execution time

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115433

--- Comment #1 from Jonathan Wakely  ---
What's the baseline for comparisons, the 13.x releases?

We could make this change for release branches, so that C++20 and C++23 tests
are not also run for C++26:

--- a/libstdc++-v3/testsuite/lib/libstdc++.exp
+++ b/libstdc++-v3/testsuite/lib/libstdc++.exp
@@ -536,10 +536,6 @@ proc v3-dg-runtest { testcases flags default-extra-flags }
{
set min_std [v3-minimum-std $test $default_std $max_std]
if { $min_std > $default_std } {
set std_list $min_std
-   if { $min_std != $max_std } {
-   # Also test the latest version.
-   lappend std_list "$max_std"
-   }
} else {
# Only run each test once with the default -std option.
# This avoids increasing the run time for most testers.


That could make a difference, because many of the C++20 tests are very slow to
compile (std::ranges, std::format, std::chrono::parse are all slow to compile).

Another possible culprit is that you now have tbb-devel installed on the test
machine, which causes the PSTL tests to be run instead of skipped. Some of
those are slow too.

[Bug libstdc++/115420] Default constructor of unordered_map deleted

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115420

--- Comment #6 from Jonathan Wakely  ---
We could even do:

/home/jwakely/gcc/15/include/c++/15.0.0/bits/hashtable.h:78:58: error: static
assertion failed: std::hash specialization is disabled; maybe the correct
header has not been included

[Bug libstdc++/115420] Default constructor of unordered_map deleted

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115420

--- Comment #5 from Jonathan Wakely  ---
And if _Check_hash_requirements is defined at namespace scope not inside
_Hashtable then the first location is much easier to read:

/home/jwakely/gcc/15/include/c++/15.0.0/bits/hashtable.h: In instantiation of
'struct
std::_Check_hash_requirements > >':

[Bug libstdc++/115420] Default constructor of unordered_map deleted

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115420

Jonathan Wakely  changed:

   What|Removed |Added

   Severity|normal  |enhancement
   Last reconfirmed||2024-06-11
 Status|CLOSED  |NEW
 Ever confirmed|0   |1
 Resolution|INVALID |---

--- Comment #4 from Jonathan Wakely  ---
If we add this to _Hashtable:

  template
struct _Check_hash_requirements : true_type
{
  static_assert(is_copy_constructible<_Hash>::value,
"custom hash function must be copy constructible");
  static_assert(is_destructible<_Hash>::value,
"custom hash function must be destructible");
};

  template
struct _Check_hash_requirements> : true_type
{
  static_assert(is_default_constructible>::value,
"the std::hash specialization is disabled");
};
  static_assert(_Check_hash_requirements<_Hash>::value, "");


Then the first error is much clearer where the problem lies:

In file included from
/home/jwakely/gcc/15/include/c++/15.0.0/bits/unordered_map.h:33,
 from /home/jwakely/gcc/15/include/c++/15.0.0/unordered_map:41,
 from un.cc:1:
/home/jwakely/gcc/15/include/c++/15.0.0/bits/hashtable.h: In instantiation of
'struct std::_Hashtable, std::pair, long unsigned int>,
std::allocator, long unsigned
int> >, std::__detail::_Select1st,
std::equal_to >,
std::hash >,
std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash,
std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits
>::_Check_hash_requirements > >':
/home/jwakely/gcc/15/include/c++/15.0.0/bits/hashtable.h:221:54:   required
from 'class std::_Hashtable, std::pair, long unsigned int>,
std::allocator, long unsigned
int> >, std::__detail::_Select1st,
std::equal_to >,
std::hash >,
std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash,
std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits >'
  221 |   static_assert(_Check_hash_requirements<_Hash>::value, "");
  |  ^
/home/jwakely/gcc/15/include/c++/15.0.0/bits/unordered_map.h:112:18:   required
from 'class std::unordered_map, long unsigned
int>'
  112 |   _Hashtable _M_h;
  |  ^~~~
un.cc:5:45:   required from here
5 |   std::unordered_map bar;
  | ^~~
/home/jwakely/gcc/15/include/c++/15.0.0/bits/hashtable.h:218:62: error: static
assertion failed: the std::hash specialization is disabled
  218 |   static_assert(is_default_constructible>::value,
  |  ^

So let's reopen this as a diagnostic RFE for the library.

[Bug c++/115429] requires clause wrongly accepts unqualified access to inherited static members

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115429

Jonathan Wakely  changed:

   What|Removed |Added

   Last reconfirmed||2024-06-11
   Keywords||accepts-invalid
 Status|UNCONFIRMED |NEW
 Ever confirmed|0   |1

--- Comment #1 from Jonathan Wakely  ---
Confirmed, the requires clause should not do name lookup in the dependent base.

[Bug libstdc++/115421] Multi-threaded condition_variable app throws when linking as -static on Linux

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115421

--- Comment #15 from Jonathan Wakely  ---
(In reply to Liviu Ionescu from comment #12)
> Isn't it possible to fix libstdc++ in order to run static multi-threaded
> apps on older systems too?

Just link all of libpthread.a as Andrew said.

[Bug libstdc++/115421] Multi-threaded condition_variable app throws when linking as -static on Linux

2024-06-11 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115421

--- Comment #14 from Jonathan Wakely  ---
This is just a dup of PR 58909

[Bug libstdc++/115399] std::tr2::dynamic_bitset shift behaves differently from std::bitset

2024-06-10 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115399

Jonathan Wakely  changed:

   What|Removed |Added

   Keywords||wrong-code
   Assignee|unassigned at gcc dot gnu.org  |redi at gcc dot gnu.org
 Status|NEW |ASSIGNED

[Bug libstdc++/115402] std::atomic_ref compile-error in compare_exchange_[weak/strong]() and wait()

2024-06-10 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115402

--- Comment #6 from Jonathan Wakely  ---
There is a paper being written to address both those issues, but it hasn't been
published yet. It should be P3323 when it's ready.

[Bug c++/115410] Missing optimization: typeid(*a)==typeid(*b) could be optimized to a->_vptr==b->_vptr

2024-06-10 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115410

--- Comment #8 from Jonathan Wakely  ---
(In reply to user202729 from comment #7)
> (In reply to Andrew Pinski from comment #6)
> > They can be different due to the way shared libraries work.
> 
> Ah, too bad.
> 
> Is it safe to at least assume that the function pointers inside the virtual
> pointer table be equal then?

No, there can be multiple definitions of a symbol, with different addresses.


 The original motivation was to devirtualize the
> function call inside something like (though this would be a different PR)
> 
> if(typeid(*x)==typeid(A))
> x->f();
> 
> then would it be safe to assume `x->_vptr[0] == ::f`?

No, but the transformation might be valid anyway. There could be multiple
copies of A::f with different addresses, but they all have to have the same
effects and so it doesn't matter which one gets called.

[Bug libstdc++/115402] std::atomic_ref compile-error in compare_exchange_[weak/strong]() and wait()

2024-06-10 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115402

--- Comment #5 from Jonathan Wakely  ---
And https://cplusplus.github.io/LWG/issue4069 too.

[Bug libstdc++/115399] std::tr2::dynamic_bitset shift behaves differently from std::bitset

2024-06-10 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115399

Jonathan Wakely  changed:

   What|Removed |Added

   Last reconfirmed||2024-06-10
 Ever confirmed|0   |1
 Status|UNCONFIRMED |NEW

--- Comment #3 from Jonathan Wakely  ---
The tr2 extensions never even got proposed for standardization and are not in
any ISO document at all. They're not well tested and nobody uses them.

[Bug web/115391] Suggest add current size of git repository to git page

2024-06-08 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115391

--- Comment #6 from Jonathan Wakely  ---
(In reply to Andrew Pinski from comment #3)
> Also you can use `--depth=1` to speed up the checkout if you don't need the
> full history.

Or partial clones, which avoid the problems of truncated history that shallow
(i.e. --depth=N) clones have.

https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone/

[Bug web/115391] Suggest add current size of git repository to git page

2024-06-08 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115391

--- Comment #1 from Jonathan Wakely  ---
You really shouldn't ever need to start again, you can just do:

git fetch origin && git reset --hard origin/master

[Bug driver/115368] Wrong order of gcc include paths on musl systems

2024-06-06 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115368

--- Comment #3 from Jonathan Wakely  ---
Please send patch to the gcc-patches mailing list rather than attaching them
here.

https://gcc.gnu.org/contribute.html#patches

[Bug driver/103949] gcc fails to provide a standard conforming C11 or C++17 environment even when specifying -std=c11 or -std=c++17

2024-06-06 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103949

--- Comment #21 from Jonathan Wakely  ---
(In reply to Jonathan Wakely from comment #20)
> It's nonsense to suggest that only maintainers can make such changes to the
> docs, since it's clear and obvious that GCC does not provide everything the
> standard refers to as "the implementation", that doesn't require specialized
> knowledge.
> 
> Unfocused ranting and complaining isn't going to achieve anything. If you're
> not happy with the docs, suggest changes.

For example, anybody could propose something like this:

--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -136,6 +136,14 @@ designated by @var{byte-size} in the following text. 
Refer to the NIST,
 IEC, and other relevant national and international standards for the full
 listing and explanation of the binary and decimal byte size prefixes.

+GCC only provides part of what the C and C++ standards refer to as
+"an implementation" of the language. To get a conforming hosted implementation
+it is necessary to combine GCC with a C library, libc, which is usually part
+of the operating system, e.g., the GNU C Library provides libc for GNU/Linux
+systems. Some C and C++ programs might require linking to additional libraries
+in order to get a complete hosted implementation, e.g., @option{-lm},
+@option{-latomic}, and @option{-pthread} may be required in some cases.
+
 @c man end

 @xref{Option Index}, for an index to GCC's options.


I'm sure this could be improved, but it's a concrete suggestion instead of
unfocused complaints.

[Bug driver/103949] gcc fails to provide a standard conforming C11 or C++17 environment even when specifying -std=c11 or -std=c++17

2024-06-06 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103949

--- Comment #20 from Jonathan Wakely  ---
(In reply to frankhb1989 from comment #19)
> It may be quite difficult to improve the docs without the first step from
> the maintainers to make the sensible default clear enough. Anyway, whether
> the issue a bug or an enhancement depends on how the spec says, but this
> does not work when the spec in the doc is just missing.

What does "when the spec in the doc is just missing" mean?

> Besides the
> supported standards (which are specs), users have to guess what features are
> expected by default, or silently accept the status quo (everything is by
> design). This will need additional communication between the maintainers to
> prevent real bugs being ignored, hence, inefficient and error-prone.

What **concrete** issue are you talking about? I see nothing actionable in what
you've written above. We need communication ... OK. The maintainers
communicate. What are you expecting to happen?

> This even happens when the spec is clear. For example, [intro.multithread]/1
> explicitly allows the programs under a hosted implementation having
> concurrent threads (not in C++98/03, though), and whether multi-threading is
> supported in a freestanding implementation is implementation-defined. As
> I've checked
> (https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Implementation.html) this
> entry is missing, which is a bug because it fails to meet the mandated
> requirements for conformance in the spec (the standard).

It fails to meet the requirements for a freestanding implementation, yes. But
not for a hosted implementation.

If you have concrete suggestions for changes to the docs, please make them.
This bug report is just long, unfocused complaints and so is not going to
achieve much.

> However, usually
> users have no enough knowledge to fix it. Virtually only the maintainers
> know what should be here. No *policies* are visible for others.

Well it should be pretty obvious from other docs that --enable-threads=single
means no threads (for both hosted and freestanding). What "policies" are you
asking for?

> In this issue, about the some parts of C++, silent degradation of
> performance is certainly bad, so keeping `-pthread` away by default makes
> sense, esp. for programs without knowledge of multi-threading environment
> (which can be at least conforming to C++98/03) as the assumptions. It is
> also not a bug in the sense that the standard actually allows
> single-threading if the doc bug above is fixed (with the acknowledgement
> that single-thread model for host implementations are not conforming after
> C++03).

If you configure GCC in a non-conforming configuration then it's
non-conforming. That's not a bug. If you don't want threads to be disabled,
don't disable them when configuring GCC. If you got a build of GCC from
somebody else and they configured it in a non-conforming way, you should talk
to them. It's not a GCC bug.

Anyway, the standard doesn't require that new threads can actually be created,
it's always possible for the std::thread constructor to fail due to reaching
resource limits, and it's conforming for the limit to be a single thread in the
program.

> However, chasing for performance over other concerns cannot be the
> policy in general. In https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100937
> the direction is actually the opposite. AFIAK all the primary platforms in
> the release criteria (https://gcc.gnu.org/gcc-14/criteria.html) support ELF
> and (most of) POSIX, so it seems that preventing to sacrifice the features
> available on these platforms is one of the candidate of the policies. But
> this is just my guess, and specific for the releases; I fail to find any
> closer to guarantees in other GCC docs. So, please clarify such concerned
> meta issues to reduce potential disagreements at first.

I have absolutely no idea what you're saying here.

As stated previously, the standard doesn't say you the compiler needs to be
invoked, and GCC never claims that -std=c11 is sufficient to link to libm. It
might be an improvement if the GCC manual documented that additional options
such as -lm or -pthread might be needed for a conforming environment, and that
some parts of "the implementation" need to be provided outside of GCC, e.g. by
your OS libc (as stated previously, the C++ library already *does* document
that -pthread might be required for std::thread support).

It's nonsense to suggest that only maintainers can make such changes to the
docs, since it's clear and obvious that GCC does not provide everything the
standard refers to as "the implementation", that doesn't require specialized
knowledge.

Unfocused ranting and complaining isn't going to achieve anything. If you're
not happy with the docs, suggest changes.

I'm inclined to close this bug because there is nothing actionable here (except
"make everything work how I want when I say -std=c11" which seems unlikely to
happen).

[Bug c++/115371] Hard to decode error message when fixed underlying type of enum is not declared

2024-06-06 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115371

Jonathan Wakely  changed:

   What|Removed |Added

 Resolution|--- |DUPLICATE
 Status|UNCONFIRMED |RESOLVED

--- Comment #1 from Jonathan Wakely  ---
.

*** This bug has been marked as a duplicate of bug 64758 ***

[Bug c++/64758] [C++11] Give better error message when name of enum's base type cannot be resolved

2024-06-06 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64758

Jonathan Wakely  changed:

   What|Removed |Added

 CC||kamil_tym at wp dot pl

--- Comment #8 from Jonathan Wakely  ---
*** Bug 115371 has been marked as a duplicate of this bug. ***

[Bug other/115241] header-tools scripts not compatible to python3

2024-06-05 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115241

Jonathan Wakely  changed:

   What|Removed |Added

   Target Milestone|--- |15.0
 Resolution|--- |FIXED
 Status|UNCONFIRMED |RESOLVED

--- Comment #3 from Jonathan Wakely  ---
Fixed on trunk now, thanks for the patch

[Bug libstdc++/88545] std::find compile to memchr in trivial random access cases (patch)

2024-06-05 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88545

Jonathan Wakely  changed:

   What|Removed |Added

URL||https://gcc.gnu.org/piperma
   ||il/gcc-patches/2024-June/65
   ||3731.html
   Keywords||patch

--- Comment #9 from Jonathan Wakely  ---
Patch posted: https://gcc.gnu.org/pipermail/gcc-patches/2024-June/653731.html

Rerunning benchmarks with this patch would be very welcome.

[Bug c++/115357] template argument deduction/substitution failed on lambda function

2024-06-05 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115357

Jonathan Wakely  changed:

   What|Removed |Added

 Status|UNCONFIRMED |RESOLVED
 Resolution|--- |DUPLICATE

--- Comment #1 from Jonathan Wakely  ---
reported twice

*** This bug has been marked as a duplicate of bug 115358 ***

[Bug c++/115358] template argument deduction/substitution failed on lambda function

2024-06-05 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115358

--- Comment #3 from Jonathan Wakely  ---
*** Bug 115357 has been marked as a duplicate of this bug. ***

[Bug libstdc++/88545] std::find compile to memchr in trivial random access cases (patch)

2024-06-05 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88545

--- Comment #8 from Jonathan Wakely  ---
Yes, but it's only a missed-optimization bug so there are much higher
priorities.

[Bug libstdc++/115335] std::span at method is missing feature test macro __cpp_lib_span >= 202311L

2024-06-04 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115335

Jonathan Wakely  changed:

   What|Removed |Added

   Target Milestone|--- |14.2
 Status|NEW |RESOLVED
 Resolution|--- |FIXED

--- Comment #4 from Jonathan Wakely  ---
Fixed for 14.2, thanks for the report.

[Bug c++/110137] implement clang -fassume-sane-operator-new

2024-06-04 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110137

--- Comment #11 from Jonathan Wakely  ---
If a program really does need to ensure a particular TU assumes new can modify
global memory (e.g. in the TU defining operator new, which makes use of some
data structure) then that TU should probably be firewalled from the rest of the
program, and not use LTO.

[Bug c++/110137] implement clang -fassume-sane-operator-new

2024-06-04 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110137

--- Comment #10 from Jonathan Wakely  ---
But replacing operator new is a global property of the program. It seems to me
that any translation unit claiming that operator new is sane must imply that
it's sane globally.

It doesn't make sense for a function assuming A is true to be inlined into a
function assuming A is false, when A will actually be the same for both.

[Bug libstdc++/115335] std::span at method is missing feature test macro __cpp_lib_span >= 202311L

2024-06-04 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115335

Jonathan Wakely  changed:

   What|Removed |Added

   Last reconfirmed||2024-06-04
 Ever confirmed|0   |1
 Status|UNCONFIRMED |NEW

--- Comment #1 from Jonathan Wakely  ---
I updated the macro value but seem to have forgotten to check it in 

[Bug libstdc++/100667] [11/12 Regression] std::tuple cannot be constructed from A&&, if A not defined (only forward declared)

2024-06-03 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100667

Jonathan Wakely  changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution|--- |FIXED

--- Comment #17 from Jonathan Wakely  ---
I think this is fixed now then.

[Bug c++/95349] Using std::launder(p) produces unexpected behavior where (p) produces expected behavior

2024-06-03 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95349

--- Comment #52 from Jonathan Wakely  ---
(In reply to Christopher Nerz from comment #45)
> This is a critical bug which renders gcc unusable for safety relevant
> systems using expected/variant or simple ipc.

I don't think your example demonstrates that.

> alignas(8) std::byte buffer[8]; // some buffer
> new (buffer) double{1}; // some completely trivial data
> // reuse memory -> double ends lifetime, uint64 starts lifetime
> std::uint64_t * res = new (buffer) std::uint64_t;

This starts the lifetime of a new object, but it has indeterminate value.

> // *res is allowed to be used as it is the correct pointer returned by
> new

The pointer does point to the new object, but derefencing it causes a read of
an indeterminate value, which is undefined behaviour.

> // *res == 0x3ff0 // and gives correct value
> // The very definition of std::launder says that it is suppose to be
> used as:
> return (*res == *std::launder(reinterpret_cast(buffer)));

It looks like what you're actually trying to do is:

alignas(8) std::byte buffer[8];
new (buffer) double{1};
std::uint64_t* res = std::start_lifetime_as(buffer);
return *res == 0x3ff0;


This is not what std::launder is for.

[Bug c++/95349] Using std::launder(p) produces unexpected behavior where (p) produces expected behavior

2024-06-03 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95349

--- Comment #51 from Jonathan Wakely  ---
(In reply to Richard Biener from comment #48)
> (In reply to Christopher Nerz from comment #47)
> > But shouldn't both give the same value?
> 
> I'm not sure what the standard says to this.  Does std::launder(...)
> sanitize earlier "undefined behavior"?  For example failing to initialize
> an object?

No.

The example appears to be trying to use std::launder as std::start_lifetime_as,
but they're not the same.

[Bug libstdc++/105258] std::get_temporary_buffer() does not respect alignment (affects std::stable_sort())

2024-06-01 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105258

Jonathan Wakely  changed:

   What|Removed |Added

   Keywords||patch
URL||https://gcc.gnu.org/piperma
   ||il/gcc-patches/2024-June/65
   ||3296.html

--- Comment #8 from Jonathan Wakely  ---
Patch posted: https://gcc.gnu.org/pipermail/gcc-patches/2024-June/653296.html

[Bug libstdc++/115269] Hardcoded links in 14.1 docs to pages from release 4.3.2

2024-06-01 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115269

Jonathan Wakely  changed:

   What|Removed |Added

   Target Milestone|--- |11.5
 Status|NEW |RESOLVED
 Resolution|--- |FIXED

--- Comment #7 from Jonathan Wakely  ---
Fixed on all active branches. Thanks for the report.

[Bug libstdc++/110572] ld.lld: error: duplicate symbol: std::type_info::operator==(std::type_info const&) const

2024-05-31 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110572

Jonathan Wakely  changed:

   What|Removed |Added

 CC||martin at martin dot st

--- Comment #11 from Jonathan Wakely  ---
CC Martin Storsjo to see if changing Clang would be possible, or if he has a
better idea for the preprocessor check suggested in comment 9.

It might be that Clang can't pre-define this macro because it has different
values for different mingw/mingw-w64/w64devkit toolchains, and clang wouldn't
know which one to be compatible with a priori.

[Bug libstdc++/110572] ld.lld: error: duplicate symbol: std::type_info::operator==(std::type_info const&) const

2024-05-31 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110572

--- Comment #10 from Jonathan Wakely  ---
(In reply to Jonathan Wakely from comment #1)
> I would argue that the root cause is that Clang does not conform to the
> platform ABI for mingw-w64, which requires __GXX_TYPEINFO_EQUALITY_INLINE=0
> to be defined.

I stand by this comment though. If Clang wants to be able to use libstdc++
headers on Windows, it should be compatible (i.e. define the same ABI-impacting
macros) with g++ on Windows.

[Bug libstdc++/110572] ld.lld: error: duplicate symbol: std::type_info::operator==(std::type_info const&) const

2024-05-31 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110572

--- Comment #9 from Jonathan Wakely  ---
Right, for Clang we need:

--- a/libstdc++-v3/libsupc++/typeinfo
+++ b/libstdc++-v3/libsupc++/typeinfo
@@ -73,7 +73,7 @@ namespace __cxxabiv1

 // By default follow the old inline rules to avoid ABI changes.
 #ifndef __GXX_TYPEINFO_EQUALITY_INLINE
-#  if !__GXX_WEAK__
+#  if !__GXX_WEAK__ || defined(_WIN32)
 #define __GXX_TYPEINFO_EQUALITY_INLINE 0
 #  else
 #define __GXX_TYPEINFO_EQUALITY_INLINE 1
@@ -188,6 +188,9 @@ namespace std
 #endif

 #if __GXX_TYPEINFO_EQUALITY_INLINE || __cplusplus > 202002L
+#if ! __GXX_TYPEINFO_EQUALITY_INLINE
+  [[__gnu__::__always_inline__]]
+# endif
   _GLIBCXX23_CONSTEXPR inline bool
   type_info::operator==(const type_info& __arg) const _GLIBCXX_NOEXCEPT
   {


Because otherwise the macro gets defined to 1 and so the always_inline
attribute isn't used.

[Bug libstdc++/110572] ld.lld: error: duplicate symbol: std::type_info::operator==(std::type_info const&) const

2024-05-31 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110572

--- Comment #7 from Jonathan Wakely  ---
This is the fix I'm suggesting:

--- a/libstdc++-v3/libsupc++/typeinfo
+++ b/libstdc++-v3/libsupc++/typeinfo
@@ -188,6 +188,9 @@ namespace std
 #endif

 #if __GXX_TYPEINFO_EQUALITY_INLINE || __cplusplus > 202002L
+# if ! __GXX_TYPEINFO_EQUALITY_INLINE
+  [[__gnu__::__always_inline__]]
+# endif
   _GLIBCXX23_CONSTEXPR inline bool
   type_info::operator==(const type_info& __arg) const _GLIBCXX_NOEXCEPT
   {

[Bug libstdc++/110572] ld.lld: error: duplicate symbol: std::type_info::operator==(std::type_info const&) const

2024-05-31 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110572

--- Comment #6 from Jonathan Wakely  ---
(In reply to Peter Damianov from comment #5)
> #include 
> int main() { return typeid(0) == typeid(0); }
> 
> The following reproduces for me, although strangely only with -std=c++23 and
> -static-libstdc++.

Because it's constexpr (and so always inline) in C++23, and not in C++20.

I think I probably meant to type c++23 in comment 3.

[Bug libstdc++/105258] std::get_temporary_buffer() does not respect alignment (affects std::stable_sort())

2024-05-31 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105258

--- Comment #7 from Jonathan Wakely  ---
The patch needs a little refactoring to share code with std::stacktrace, but it
will be fixed soon.

[Bug middle-end/109849] suboptimal code for vector walking loop

2024-05-30 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109849

--- Comment #35 from Jonathan Wakely  ---
(In reply to Jonathan Wakely from comment #31)
> Bisection points to r14-5831-gaae723d360ca26cd9fd0b039fb0a616bd0eae363 for
> that remaining FAIL as well (and it isn't fixed by the new patch).
> 
> It introduced a new warning which wasn't present before:
> 
> /tmp/build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:437:
> warning: 'void* __builtin_memcpy(void*, const void*, long unsigned int)'
> writing between 2 and 9223372036854775806 bytes into a region of size 0
> overflows the destination [-Wstringop-overflow=]

I don't know why we only get a warning for C++98 and not other modes, but this
seems to fix it:

--- a/libstdc++-v3/include/bits/vector.tcc
+++ b/libstdc++-v3/include/bits/vector.tcc
@@ -933,6 +933,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

const size_type __len =
  _M_check_len(__n, "vector::_M_range_insert");
+   if (__len < (__n + (__old_finish - __old_start)))
+ __builtin_unreachable();
+
pointer __new_start(this->_M_allocate(__len));
pointer __new_finish(__new_start);
__try

So it looks like the compiler can't tell that _M_check_len(n) doesn't undergo
unsigned wraparound.

[Bug libstdc++/115285] [12/13/14/15 Regression] std::unordered_set can have duplicate value

2024-05-30 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115285

--- Comment #10 from Jonathan Wakely  ---
When deciding whether a key already exists in the hash set we use these
overloads:

  template
static __conditional_t<
  __and_<__is_nothrow_invocable<_Hash&, const key_type&>,
 __not_<__is_nothrow_invocable<_Hash&, _Kt>>>::value,
  key_type, _Kt&&>
_S_forward_key(_Kt&& __k)
{ return std::forward<_Kt>(__k); }

  static const key_type&
  _S_forward_key(const key_type& __k)
  { return __k; }


If the value being inserted, __k, can be hashed directly using the hash
function then we return it unchanged, and then hash it. If it can't be hashed
directly, we convert it to the container's key_type, which is TrimmedStr.

In this case, a std::string can be hash directly without constructing a
TrimmedStr (because of the questionable std::hash specialization using
inheritance). So we don't convert it to TrimmedStr and just hash it directly.
Hashing "foo"s and "foo "s give different hash values, so we do not consider
them to be equivalent keys.

While I think the code is highly questionable, the standard does say that
inserting [first, last) is equivalent to insert(*first) for each iterator, and
that would force an implicit conversion to value_type.

So I'm not sure if the optimization to avoid temporaries (PR 96088) is actually
allowed by the standard.

[Bug libstdc++/115285] [12/13/14/15 Regression] std::unordered_set can have duplicate value

2024-05-30 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115285

--- Comment #9 from Jonathan Wakely  ---
(In reply to Andrew Pinski from comment #7)
> I am suspecting it was
> https://gcc.gnu.org/git/?p=gcc.git;a=commit;
> h=2c43f5ec9db163696de8691eb529df06c4999bcc which caused the issue.

Ah no, I think you're right about this.

The problem is not std::equal_to, but in std::hash, because it
takes an argument of type std::string not TrimmedStr.

This means that hashing "foo "s does not convert to a TrimmedStr first, so it
hashes the un-trimmed string.

This fixes the code:

template<> struct hash {
  bool operator()(const TrimmedStr& s) const noexcept
  { return std::hash{}(s); }
};

I'm not sure if the code is valid or not. It certainly seems like a problem
that a plain std::string can be compared to a TrimmedStr using
std::equal_to *and* can be hashed using std::hash, when
a plain std::string is *not* a TrimmedStr.

Using inheritance this way is a bad idea, certainly for the std::hash
specialization. IMHO also for the TrimmedStr itself.

[Bug libstdc++/115285] [12/13/14/15 Regression] std::unordered_set can have duplicate value

2024-05-30 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115285

--- Comment #8 from Jonathan Wakely  ---
Or r12-6272-ge3ef832a9e8d6a

I think the testcase is invalid. The unordered_set uses
std::equal_to to decide if a key already exists in the container,
and that just uses operator== which is not defined for TrimmedStr, so it uses
the equality comparison for std::string. When that is used to compare
TrimmedStr("foo") == "foo "s it's equivalent to "foo"s == "foo "s which is
obviously false.

[Bug libstdc++/106852] Implement C++23 P2465R3 Standard Library Modules std and std.compat

2024-05-29 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106852

--- Comment #5 from Jonathan Wakely  ---
Bug 114600 comment 10 has a std module implementation attached.

[Bug libstdc++/115269] Hardcoded links in 14.1 docs to pages from release 4.3.2

2024-05-29 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115269

Jonathan Wakely  changed:

   What|Removed |Added

 Status|UNCONFIRMED |NEW
 Ever confirmed|0   |1
   Last reconfirmed||2024-05-29

--- Comment #1 from Jonathan Wakely  ---
(In reply to Phil Miller from comment #0)
> A couple spots in the current-version documentation seem to spuriously point
> to pages specifically from release version 4.3.2:
> 
> https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/doc/xml/manual/
> using.xml;hb=b644126237a1aa8599f767a5e0bbada1d7286f44#l10
> 
> https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/doc/html/manual/
> using.html;hb=b644126237a1aa8599f767a5e0bbada1d7286f44#l7

Just one spot, the html page is generated from the xml.

[Bug libstdc++/111641] FAIL: 19_diagnostics/stacktrace/current.cc -std=gnu++23 execution test

2024-05-29 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111641

--- Comment #11 from Jonathan Wakely  ---
Dave, does this fix it for hppa-linux-gnu too?

[Bug libstdc++/114940] std::generator relies on an optional overload of operator delete

2024-05-28 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114940

Jonathan Wakely  changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution|--- |FIXED

--- Comment #12 from Jonathan Wakely  ---
Fixed for 13.4 and 14.2

[Bug c++/110137] implement clang -fassume-sane-operator-new

2024-05-27 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110137

--- Comment #7 from Jonathan Wakely  ---
Thanks for the patch, but patch review happens on the mailing list, not in
bugzilla. Please repost to gcc-patches as documented in the submission
guidelines, thanks.

[Bug libstdc++/115209] The implementation of concat_view refers to p2542r7 rather than the p2542r8

2024-05-24 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115209

--- Comment #1 from Jonathan Wakely  ---
As already noted at
https://gcc.gnu.org/pipermail/gcc-patches/2024-May/652571.html

[Bug c++/100611] coroutines: destructor called too many times for coroutine lambda stored object

2024-05-23 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100611

--- Comment #11 from Jonathan Wakely  ---
The fix is in 13.1

[Bug c++/57025] Solaris g++ defines __STDC_VERSION__=199901L

2024-05-22 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57025

--- Comment #13 from Jonathan Wakely  ---
(In reply to Alan Coopersmith from comment #11)
> While Solaris 11.3 support has been dropped from gcc now, Jonathan Perkins
> from pkgsrc found that just removing the definition of __STDC_VERSION__
> didn't work with some of the illumos headers:
> https://github.com/jperkin/notes/blob/main/gcc-cpp-stdc/README.md

So the illumos sys/feature_tests.h is using __STD_VERSION__ to mean "the
version of the C library to expose for the current language mode", whether that
language mode is a C language mode or a C++ one. And that's an entirely
reasonable use of it IMHO, and conforms to the C++ standard.

I stick by what I said in comment 4: code which assumes that __STDC_VERSION__
being defined implies a C compiler is being used is **broken C++ code**. There
is no compliance requirement why GCC should stop defining __STDC_VERSION__, and
there's a good reason to keep defining it if defining it is needed (or just
helpful) for a target's libc headers.

The Cython code quoted in the illumos notes should be fixed to check the
__cplusplus condition first, then if __cplusplus is not defined check
__STDC_VERSION__. It's just bad code.

N.B. since C++23 #include  works in C++ anyway:
https://wg21.link/P0943R6

[Bug c++/115196] Bad error message when using library functions from versions before they were introduced

2024-05-22 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115196

--- Comment #4 from Jonathan Wakely  ---
(In reply to Halalaluyafail3 from comment #0)
> This note doesn't seem to be very helpful, it mentions adding an extra
> '#include' when one is already present. A better error message here
> would be to omit the note, or to make it mention changing the selected C++
> standard version.

If you'd tried gcc trunk on godbolt you'd have seen that's exactly what
happens:

:3:10: note: 'std::to_address' is only available from C++20 onwards

There was just a typo which made gcc think std::to_address is part of 
in C++11, so if it wasn't declared in your program then it must be because you
didn't include .

After the fix it correctly suggests using at least C++20.

[Bug c++/115196] Bad error message when using library functions from versions before they were introduced

2024-05-22 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115196

--- Comment #3 from Jonathan Wakely  ---
You seem to imply it's a general problem, but I think it's specific to
sd::to_address, and that's already fixed.

[Bug c++/107500] [12 Regression] Useless atexit entry for ~constant_init in eh_globals.cc

2024-05-22 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107500

Jonathan Wakely  changed:

   What|Removed |Added

 Resolution|--- |FIXED
 Status|ASSIGNED|RESOLVED

--- Comment #29 from Jonathan Wakely  ---
Fixed for 12.4 and up.

[Bug libstdc++/115099] compilation error: format thread::id

2024-05-22 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115099

Jonathan Wakely  changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution|--- |FIXED

--- Comment #4 from Jonathan Wakely  ---
Fixed for 14.2, thanks for the report.

[Bug libstdc++/114940] std::generator relies on an optional overload of operator delete

2024-05-22 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114940

Jonathan Wakely  changed:

   What|Removed |Added

   Target Milestone|--- |13.4
   Assignee|unassigned at gcc dot gnu.org  |redi at gcc dot gnu.org
 Status|NEW |ASSIGNED

[Bug libstdc++/114940] std::generator relies on an optional overload of operator delete

2024-05-22 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114940

--- Comment #8 from Jonathan Wakely  ---
We have the same problem in 

[Bug libstdc++/79384] Clang doesn't like variant's std::visit

2024-05-21 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79384

Jonathan Wakely  changed:

   What|Removed |Added

 Resolution|--- |WORKSFORME
 Status|NEW |RESOLVED

--- Comment #1 from Jonathan Wakely  ---
I can't reproduce this now. It might have been the same as Bug 90397 which was
fixed for 9.2, or it might have been related to
https://bugs.llvm.org/show_bug.cgi?id=31852

The test case compiles fine with clang 17 and libstdc++ headers from GCC 7.5,
8.x, 9.2, or later.

[Bug c++/107800] confusing message with to_address in C++17

2024-05-21 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107800

Jonathan Wakely  changed:

   What|Removed |Added

 Resolution|--- |FIXED
 Status|ASSIGNED|RESOLVED

--- Comment #12 from Jonathan Wakely  ---
Fixed for 13.4 and 14.2

[Bug libstdc++/108976] codecvt for Unicode allows surrogate code points

2024-05-21 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108976

Jonathan Wakely  changed:

   What|Removed |Added

 Resolution|--- |FIXED
 Status|NEW |RESOLVED

--- Comment #15 from Jonathan Wakely  ---
Fixed for 13.4 and 14.1

[Bug c++/102774] Stop showing "error: variable or field ‘f’ declared void" after an earlier error in a declarator

2024-05-21 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102774

Jonathan Wakely  changed:

   What|Removed |Added

   Last reconfirmed|2022-05-18 00:00:00 |2024-5-21

--- Comment #5 from Jonathan Wakely  ---
Another one:

template void func(T) { }


f.cc:1:48: error: variable or field ‘func’ declared void
1 | template void func(T) { }
  |^~~~
f.cc:1:53: error: ‘T’ was not declared in this scope
1 | template void func(T) { }
  | ^

[Bug c++/115173] GCC hang and memory exhaustion issue with complex nested initializer lists in C++ std::string construction

2024-05-21 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115173

--- Comment #2 from Jonathan Wakely  ---
Further reduced:

struct string { string(int) { } };

void j() {
 
string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(>)
{ } };


Still garbage though.

[Bug c++/115173] GCC hang and memory exhaustion issue with complex nested initializer lists in C++ std::string construction

2024-05-21 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115173

Jonathan Wakely  changed:

   What|Removed |Added

   Last reconfirmed||2024-05-21
   Keywords||diagnostic,
   ||ice-on-invalid-code,
   ||memory-hog
 Status|UNCONFIRMED |NEW
 Ever confirmed|0   |1

--- Comment #1 from Jonathan Wakely  ---
I'm marking this as ice-on-invalid-code, even though it gets killed rather than
ICE-ing. But it is invalid.

The summary seems misleading, there are no nested initializer lists here. It's
just syntactically ill-formed code with mismatched braces and parentheses.

And most of the functions are irrelevant to the exponential code.

Reduced:

#include 

struct string { string(std::initializer_list) { } };

void j() {
 
string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(string(>)
{ } };
}


This seems like auto-generated garbage, not something anybody would ever write
by accident, so should be very low priority.

[Bug c++/107800] confusing message with to_address in C++17

2024-05-21 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107800

Jonathan Wakely  changed:

   What|Removed |Added

 Status|NEW |ASSIGNED
   Assignee|unassigned at gcc dot gnu.org  |redi at gcc dot gnu.org

[Bug c++/107800] confusing message with to_address in C++17

2024-05-21 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107800

--- Comment #8 from Jonathan Wakely  ---
(In reply to Amatul Adeeba from comment #6)
> I mean even after trying the typo that is mentioned above, the error still
> occurs.

No it doesn't, it gives the correct error:

107800.cc: In function 'int main()':
107800.cc:5:8: error: 'to_address' is not a member of 'std'
5 |   std::to_address(p);
  |^~
107800.cc:5:8: note: 'std::to_address' is only available from C++20 onwards

N.B. after fixing the typo you need to remove gcc/cp/std-name-hint.* in the GCC
source dir, so that those files are recreated from the csv file. If you don't
do that, you won't get the fix.

[Bug libstdc++/114244] Need to use round when parsing fractional seconds

2024-05-21 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114244

Jonathan Wakely  changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution|--- |FIXED
   Target Milestone|13.4|14.0

--- Comment #9 from Jonathan Wakely  ---
(In reply to Jonathan Wakely from comment #7)
> Fixed on trunk so far.

I'm not sure why I set the target milestone to 13.3, as chrono::parse isn't
present in the gcc-13 branch at all. So this bug only affected gcc-14 and was
fixed in time for the 14.1 release.

[Bug c++/115160] Enabling undefined behaviour sanitizer causes or'ed bit shift to report wrong result

2024-05-21 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115160

--- Comment #5 from Jonathan Wakely  ---
Specifically, std::vector::iterator::operator++(int) is "just a
function", so the compiler doesn't "know" that it modifies the iterator every
time it's called. To the compiler, the code looks like:

(deref(inc(b)) | (deref(inc(b)) << 8) | (deref(inc(b)) << 16) | (deref(inc(b))
<< 24)

And this isn't clear that this modifies b and that the result depends on the
unspecified order that each deref(inc(b)) subexpression is evaluated.

But that doesn't really matter anyway. I don't think there is actually any
undefined behaviour here at all, so UBsan should not give any errors.
Evaluation of each *b++ subexpression happens before the evaluation of the next
one. But the standard doesn't specify which one is "the next one". It's not
undefined, but it's unspecified. So it's valid for the compiler to evaluate it
left-to-right, but also valid to evaluate it right-to-left, or any other order
as long as the b++ evaluations do not interleave.

[Bug c++/115163] Requesting better diagnostic for explicit constructor failure

2024-05-20 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115163

Jonathan Wakely  changed:

   What|Removed |Added

   Last reconfirmed||2024-05-20
 Ever confirmed|0   |1
 Status|UNCONFIRMED |NEW

[Bug c++/111230] show explicit functions in possible candidates

2024-05-20 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111230

Jonathan Wakely  changed:

   What|Removed |Added

   See Also||https://gcc.gnu.org/bugzill
   ||a/show_bug.cgi?id=36183

--- Comment #2 from Jonathan Wakely  ---
Dup of PR 36183?

There Jason said:

We'd probably get that by changing add_candidates to mark an explicit candidate
as bad rather than non-viable, and then adding the explanation to
convert_like_real.

[Bug libstdc++/115119] Typo in _Grapheme_cluster_view::_Iterator::operator++(int)

2024-05-17 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115119

Jonathan Wakely  changed:

   What|Removed |Added

 Resolution|--- |FIXED
 Status|ASSIGNED|RESOLVED
   Target Milestone|--- |14.2

--- Comment #9 from Jonathan Wakely  ---
Fixed for 14.2, thanks for the report (and to the dup reporters).

[Bug libstdc++/115119] Typo in _Grapheme_cluster_view::_Iterator::operator++(int)

2024-05-17 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115119

Jonathan Wakely  changed:

   What|Removed |Added

 CC||pilarlatiesa at gmail dot com

--- Comment #6 from Jonathan Wakely  ---
*** Bug 115134 has been marked as a duplicate of this bug. ***

[Bug libstdc++/115134] Possible typo in _Grapheme_cluster_iterator iterator

2024-05-17 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115134

Jonathan Wakely  changed:

   What|Removed |Added

 Resolution|--- |DUPLICATE
 Status|UNCONFIRMED |RESOLVED

--- Comment #1 from Jonathan Wakely  ---
Already reported twice in the past 24 hours

*** This bug has been marked as a duplicate of bug 115119 ***

[Bug libstdc++/115099] compilation error: format thread::id

2024-05-17 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115099

Jonathan Wakely  changed:

   What|Removed |Added

   Last reconfirmed||2024-05-17
   Assignee|unassigned at gcc dot gnu.org  |redi at gcc dot gnu.org
   Target Milestone|--- |14.2
 Ever confirmed|0   |1
 Status|UNCONFIRMED |ASSIGNED

[Bug libstdc++/115119] Typo in _Grapheme_cluster_view::_Iterator::operator++(int)

2024-05-16 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115119

Jonathan Wakely  changed:

   What|Removed |Added

   See Also||https://gcc.gnu.org/bugzill
   ||a/show_bug.cgi?id=115121

--- Comment #4 from Jonathan Wakely  ---
I've opened PR 115121 for the accepts-invalid compiler bug.

[Bug c++/115121] New: ++this is accepted in uninstantiated template

2024-05-16 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115121

Bug ID: 115121
   Summary: ++this is accepted in uninstantiated template
   Product: gcc
   Version: 15.0
Status: UNCONFIRMED
  Keywords: accepts-invalid
  Severity: normal
  Priority: P3
 Component: c++
  Assignee: unassigned at gcc dot gnu.org
  Reporter: redi at gcc dot gnu.org
  Target Milestone: ---

template
struct iter
{
  void operator++(int) {
auto tmp = *this;
++this;
return tmp;
  }
};

This has a typo, it should be ++*this

I assume this compiles because `this` is dependent, but we could reject it
earlier. Incrementing `this` is never valid, it doesn't matter how the template
is instantiated.

[Bug libstdc++/115119] Typo in _Grapheme_cluster_view::_Iterator::operator++(int)

2024-05-16 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115119

Jonathan Wakely  changed:

   What|Removed |Added

   Assignee|unassigned at gcc dot gnu.org  |redi at gcc dot gnu.org
 Status|NEW |ASSIGNED

--- Comment #3 from Jonathan Wakely  ---
It fails to compile if that member function is instantiated (which libstdc++
itself never does).

/home/jwakely/gcc/15/include/c++/15.0.0/bits/unicode.h:805:11: error: increment
of read-only location
'(std::__unicode::__v15_1_0::_Grapheme_cluster_view
>::_Iterator*)this'
  805 |   ++this;
  |   ^~
/home/jwakely/gcc/15/include/c++/15.0.0/bits/unicode.h:805:11: error: lvalue
required as increment operand


But ++this could be rejected without treating it as a dependent expression.

Anyway, I'll fix the library typo.

[Bug libstdc++/115119] Typo in _Grapheme_cluster_view::_Iterator::operator++(int)

2024-05-16 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115119

Jonathan Wakely  changed:

   What|Removed |Added

 Ever confirmed|0   |1
 Status|UNCONFIRMED |NEW
   Last reconfirmed||2024-05-16

--- Comment #2 from Jonathan Wakely  ---
Which would be ++*this

++this shouldn't even compile.

[Bug target/113578] Incorrect sign printed for -nan on RISC-V

2024-05-15 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113578

Jonathan Wakely  changed:

   What|Removed |Added

   Last reconfirmed||2024-05-15
 Resolution|INVALID |---
 Status|RESOLVED|REOPENED
 Ever confirmed|0   |1

--- Comment #10 from Jonathan Wakely  ---
I'm reopening this to deal with it as a libstdc++ bug, because LWG seems to
support changing the standard so that this Just Works.
https://cplusplus.github.io/LWG/issue4101

[Bug c++/104426] -fsanitize=undefined causes constexpr failures

2024-05-15 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104426

Jonathan Wakely  changed:

   What|Removed |Added

 Status|UNCONFIRMED |NEW
   Last reconfirmed||2024-05-15
 Ever confirmed|0   |1

[Bug libstdc++/115015] [14/15 Regression] libstdc++ build with '-fno-rtti' is broken

2024-05-14 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115015

Jonathan Wakely  changed:

   What|Removed |Added

 Status|UNCONFIRMED |RESOLVED
 Resolution|--- |FIXED

--- Comment #3 from Jonathan Wakely  ---
Fixed for 14.2

[Bug libstdc++/115015] [14/15 Regression] libstdc++ build with '-fno-rtti' is broken

2024-05-14 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115015

Jonathan Wakely  changed:

   What|Removed |Added

Summary|libstdc++ build with|[14/15 Regression]
   |'-fno-rtti' is broken   |libstdc++ build with
   ||'-fno-rtti' is broken
   Keywords||build
   Target Milestone|--- |14.2

[Bug libstdc++/115063] compilation error: std::basic_stracktrace::max_size()

2024-05-14 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115063

Jonathan Wakely  changed:

   What|Removed |Added

 Resolution|--- |FIXED
 Status|ASSIGNED|RESOLVED

--- Comment #4 from Jonathan Wakely  ---
Fixed for 13.3 and 14.2, thanks for the report.

  1   2   3   4   5   6   7   8   9   10   >