diff mbox series

Enforce allocator::value_type consistency for containers in C++2a

Message ID 20190603132311.GA27339@redhat.com
State New
Headers show
Series Enforce allocator::value_type consistency for containers in C++2a | expand

Commit Message

Jonathan Wakely June 3, 2019, 1:23 p.m. UTC
In previous standards it is undefined for a container and its allocator
to have a different value_type. Libstdc++ has traditionally allowed it
as an extension, automatically rebinding the allocator to the
container's value_type. Since GCC 8.1 that extension has been disabled
for C++11 and later when __STRICT_ANSI__ is defined (i.e. for
-std=c++11, -std=c++14, -std=c++17 and -std=c++2a).

Since the acceptance of P1463R1 into the C++2a draft an incorrect
allocator::value_type now requires a diagnostic. This patch implements
that by enabling the static_assert for -std=gnu++2a as well.

	* doc/xml/manual/status_cxx2020.xml: Document P1463R1 status.
	* include/bits/forward_list.h [__cplusplus > 201703]: Enable
	allocator::value_type assertion for C++2a.
	* include/bits/hashtable.h: Likewise.
	* include/bits/stl_deque.h: Likewise.
	* include/bits/stl_list.h: Likewise.
	* include/bits/stl_map.h: Likewise.
	* include/bits/stl_multimap.h: Likewise.
	* include/bits/stl_multiset.h: Likewise.
	* include/bits/stl_set.h: Likewise.
	* include/bits/stl_vector.h: Likewise.
	* testsuite/23_containers/deque/48101-3_neg.cc: New test.
	* testsuite/23_containers/forward_list/48101-3_neg.cc: New test.
	* testsuite/23_containers/list/48101-3_neg.cc: New test.
	* testsuite/23_containers/map/48101-3_neg.cc: New test.
	* testsuite/23_containers/multimap/48101-3_neg.cc: New test.
	* testsuite/23_containers/multiset/48101-3_neg.cc: New test.
	* testsuite/23_containers/set/48101-3_neg.cc: New test.
	* testsuite/23_containers/unordered_map/48101-3_neg.cc: New test.
	* testsuite/23_containers/unordered_multimap/48101-3_neg.cc: New test.
	* testsuite/23_containers/unordered_multiset/48101-3_neg.cc: New test.
	* testsuite/23_containers/unordered_set/48101-3_neg.cc: New test.
	* testsuite/23_containers/vector/48101-3_neg.cc: New test.

Tested x86_64-linux, committed to trunk.
commit e022e3a6d918af311e3770e9422badad1803d33f
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Mon Jun 3 13:53:49 2019 +0100

    Enforce allocator::value_type consistency for containers in C++2a
    
    In previous standards it is undefined for a container and its allocator
    to have a different value_type. Libstdc++ has traditionally allowed it
    as an extension, automatically rebinding the allocator to the
    container's value_type. Since GCC 8.1 that extension has been disabled
    for C++11 and later when __STRICT_ANSI__ is defined (i.e. for
    -std=c++11, -std=c++14, -std=c++17 and -std=c++2a).
    
    Since the acceptance of P1463R1 into the C++2a draft an incorrect
    allocator::value_type now requires a diagnostic. This patch implements
    that by enabling the static_assert for -std=gnu++2a as well.
    
            * doc/xml/manual/status_cxx2020.xml: Document P1463R1 status.
            * include/bits/forward_list.h [__cplusplus > 201703]: Enable
            allocator::value_type assertion for C++2a.
            * include/bits/hashtable.h: Likewise.
            * include/bits/stl_deque.h: Likewise.
            * include/bits/stl_list.h: Likewise.
            * include/bits/stl_map.h: Likewise.
            * include/bits/stl_multimap.h: Likewise.
            * include/bits/stl_multiset.h: Likewise.
            * include/bits/stl_set.h: Likewise.
            * include/bits/stl_vector.h: Likewise.
            * testsuite/23_containers/deque/48101-3_neg.cc: New test.
            * testsuite/23_containers/forward_list/48101-3_neg.cc: New test.
            * testsuite/23_containers/list/48101-3_neg.cc: New test.
            * testsuite/23_containers/map/48101-3_neg.cc: New test.
            * testsuite/23_containers/multimap/48101-3_neg.cc: New test.
            * testsuite/23_containers/multiset/48101-3_neg.cc: New test.
            * testsuite/23_containers/set/48101-3_neg.cc: New test.
            * testsuite/23_containers/unordered_map/48101-3_neg.cc: New test.
            * testsuite/23_containers/unordered_multimap/48101-3_neg.cc: New test.
            * testsuite/23_containers/unordered_multiset/48101-3_neg.cc: New test.
            * testsuite/23_containers/unordered_set/48101-3_neg.cc: New test.
            * testsuite/23_containers/vector/48101-3_neg.cc: New test.

Comments

Rainer Orth June 3, 2019, 9:17 p.m. UTC | #1
Hi Jonathan,

> In previous standards it is undefined for a container and its allocator
> to have a different value_type. Libstdc++ has traditionally allowed it
> as an extension, automatically rebinding the allocator to the
> container's value_type. Since GCC 8.1 that extension has been disabled
> for C++11 and later when __STRICT_ANSI__ is defined (i.e. for
> -std=c++11, -std=c++14, -std=c++17 and -std=c++2a).
>
> Since the acceptance of P1463R1 into the C++2a draft an incorrect
> allocator::value_type now requires a diagnostic. This patch implements
> that by enabling the static_assert for -std=gnu++2a as well.
>
> 	* doc/xml/manual/status_cxx2020.xml: Document P1463R1 status.
> 	* include/bits/forward_list.h [__cplusplus > 201703]: Enable
> 	allocator::value_type assertion for C++2a.
> 	* include/bits/hashtable.h: Likewise.
> 	* include/bits/stl_deque.h: Likewise.
> 	* include/bits/stl_list.h: Likewise.
> 	* include/bits/stl_map.h: Likewise.
> 	* include/bits/stl_multimap.h: Likewise.
> 	* include/bits/stl_multiset.h: Likewise.
> 	* include/bits/stl_set.h: Likewise.
> 	* include/bits/stl_vector.h: Likewise.
> 	* testsuite/23_containers/deque/48101-3_neg.cc: New test.
> 	* testsuite/23_containers/forward_list/48101-3_neg.cc: New test.
> 	* testsuite/23_containers/list/48101-3_neg.cc: New test.
> 	* testsuite/23_containers/map/48101-3_neg.cc: New test.
> 	* testsuite/23_containers/multimap/48101-3_neg.cc: New test.
> 	* testsuite/23_containers/multiset/48101-3_neg.cc: New test.
> 	* testsuite/23_containers/set/48101-3_neg.cc: New test.
> 	* testsuite/23_containers/unordered_map/48101-3_neg.cc: New test.
> 	* testsuite/23_containers/unordered_multimap/48101-3_neg.cc: New test.
> 	* testsuite/23_containers/unordered_multiset/48101-3_neg.cc: New test.
> 	* testsuite/23_containers/unordered_set/48101-3_neg.cc: New test.
> 	* testsuite/23_containers/vector/48101-3_neg.cc: New test.
>
> Tested x86_64-linux, committed to trunk.

this patch caused a couple of testsuite regressions:

+FAIL: g++.old-deja/g++.other/headers1.C  -std=c++98 (test for excess errors)
+UNRESOLVED: g++.old-deja/g++.other/headers1.C  -std=c++98 compilation failed to produce executable

Excess errors:
/var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/bits/stl_map.h:122:21: error: 'is_same' has not been declared
/var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/bits/stl_map.h:122:28: error: expected ',' or '...' before '<' token
/var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/bits/stl_multimap.h:121:21: error: 'is_same' has not been declared
/var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/bits/stl_multimap.h:121:28:
error: expected ',' or '...' before '<' token

+FAIL: g++.old-deja/g++.robertl/eb109.C  -std=c++98 (test for excess errors)

+FAIL: g++.dg/tree-ssa/copyprop.C   (test for excess errors)

Same error, seen everywhere (i386-pc-solaris2.11, sparc-sun-solaris2.11,
aarch64-unknown-linux-gnu, x86_64-pc-linux-gnu, ...).

	Rainer
Jonathan Wakely June 3, 2019, 9:34 p.m. UTC | #2
On 03/06/19 23:17 +0200, Rainer Orth wrote:
>Hi Jonathan,
>
>> In previous standards it is undefined for a container and its allocator
>> to have a different value_type. Libstdc++ has traditionally allowed it
>> as an extension, automatically rebinding the allocator to the
>> container's value_type. Since GCC 8.1 that extension has been disabled
>> for C++11 and later when __STRICT_ANSI__ is defined (i.e. for
>> -std=c++11, -std=c++14, -std=c++17 and -std=c++2a).
>>
>> Since the acceptance of P1463R1 into the C++2a draft an incorrect
>> allocator::value_type now requires a diagnostic. This patch implements
>> that by enabling the static_assert for -std=gnu++2a as well.
>>
>> 	* doc/xml/manual/status_cxx2020.xml: Document P1463R1 status.
>> 	* include/bits/forward_list.h [__cplusplus > 201703]: Enable
>> 	allocator::value_type assertion for C++2a.
>> 	* include/bits/hashtable.h: Likewise.
>> 	* include/bits/stl_deque.h: Likewise.
>> 	* include/bits/stl_list.h: Likewise.
>> 	* include/bits/stl_map.h: Likewise.
>> 	* include/bits/stl_multimap.h: Likewise.
>> 	* include/bits/stl_multiset.h: Likewise.
>> 	* include/bits/stl_set.h: Likewise.
>> 	* include/bits/stl_vector.h: Likewise.
>> 	* testsuite/23_containers/deque/48101-3_neg.cc: New test.
>> 	* testsuite/23_containers/forward_list/48101-3_neg.cc: New test.
>> 	* testsuite/23_containers/list/48101-3_neg.cc: New test.
>> 	* testsuite/23_containers/map/48101-3_neg.cc: New test.
>> 	* testsuite/23_containers/multimap/48101-3_neg.cc: New test.
>> 	* testsuite/23_containers/multiset/48101-3_neg.cc: New test.
>> 	* testsuite/23_containers/set/48101-3_neg.cc: New test.
>> 	* testsuite/23_containers/unordered_map/48101-3_neg.cc: New test.
>> 	* testsuite/23_containers/unordered_multimap/48101-3_neg.cc: New test.
>> 	* testsuite/23_containers/unordered_multiset/48101-3_neg.cc: New test.
>> 	* testsuite/23_containers/unordered_set/48101-3_neg.cc: New test.
>> 	* testsuite/23_containers/vector/48101-3_neg.cc: New test.
>>
>> Tested x86_64-linux, committed to trunk.
>
>this patch caused a couple of testsuite regressions:
>
>+FAIL: g++.old-deja/g++.other/headers1.C  -std=c++98 (test for excess errors)
>+UNRESOLVED: g++.old-deja/g++.other/headers1.C  -std=c++98 compilation failed to produce executable
>
>Excess errors:
>/var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/bits/stl_map.h:122:21: error: 'is_same' has not been declared
>/var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/bits/stl_map.h:122:28: error: expected ',' or '...' before '<' token
>/var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/bits/stl_multimap.h:121:21: error: 'is_same' has not been declared
>/var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/bits/stl_multimap.h:121:28:
>error: expected ',' or '...' before '<' token
>
>+FAIL: g++.old-deja/g++.robertl/eb109.C  -std=c++98 (test for excess errors)
>
>+FAIL: g++.dg/tree-ssa/copyprop.C   (test for excess errors)
>
>Same error, seen everywhere (i386-pc-solaris2.11, sparc-sun-solaris2.11,
>aarch64-unknown-linux-gnu, x86_64-pc-linux-gnu, ...).

Doh. In those files the existing static_assert wasn't guarded by a
check for C++11 or later. I'm testing this patch.
Jonathan Wakely June 3, 2019, 10:19 p.m. UTC | #3
On 03/06/19 22:34 +0100, Jonathan Wakely wrote:
>On 03/06/19 23:17 +0200, Rainer Orth wrote:
>>Hi Jonathan,
>>
>>>In previous standards it is undefined for a container and its allocator
>>>to have a different value_type. Libstdc++ has traditionally allowed it
>>>as an extension, automatically rebinding the allocator to the
>>>container's value_type. Since GCC 8.1 that extension has been disabled
>>>for C++11 and later when __STRICT_ANSI__ is defined (i.e. for
>>>-std=c++11, -std=c++14, -std=c++17 and -std=c++2a).
>>>
>>>Since the acceptance of P1463R1 into the C++2a draft an incorrect
>>>allocator::value_type now requires a diagnostic. This patch implements
>>>that by enabling the static_assert for -std=gnu++2a as well.
>>>
>>>	* doc/xml/manual/status_cxx2020.xml: Document P1463R1 status.
>>>	* include/bits/forward_list.h [__cplusplus > 201703]: Enable
>>>	allocator::value_type assertion for C++2a.
>>>	* include/bits/hashtable.h: Likewise.
>>>	* include/bits/stl_deque.h: Likewise.
>>>	* include/bits/stl_list.h: Likewise.
>>>	* include/bits/stl_map.h: Likewise.
>>>	* include/bits/stl_multimap.h: Likewise.
>>>	* include/bits/stl_multiset.h: Likewise.
>>>	* include/bits/stl_set.h: Likewise.
>>>	* include/bits/stl_vector.h: Likewise.
>>>	* testsuite/23_containers/deque/48101-3_neg.cc: New test.
>>>	* testsuite/23_containers/forward_list/48101-3_neg.cc: New test.
>>>	* testsuite/23_containers/list/48101-3_neg.cc: New test.
>>>	* testsuite/23_containers/map/48101-3_neg.cc: New test.
>>>	* testsuite/23_containers/multimap/48101-3_neg.cc: New test.
>>>	* testsuite/23_containers/multiset/48101-3_neg.cc: New test.
>>>	* testsuite/23_containers/set/48101-3_neg.cc: New test.
>>>	* testsuite/23_containers/unordered_map/48101-3_neg.cc: New test.
>>>	* testsuite/23_containers/unordered_multimap/48101-3_neg.cc: New test.
>>>	* testsuite/23_containers/unordered_multiset/48101-3_neg.cc: New test.
>>>	* testsuite/23_containers/unordered_set/48101-3_neg.cc: New test.
>>>	* testsuite/23_containers/vector/48101-3_neg.cc: New test.
>>>
>>>Tested x86_64-linux, committed to trunk.
>>
>>this patch caused a couple of testsuite regressions:
>>
>>+FAIL: g++.old-deja/g++.other/headers1.C  -std=c++98 (test for excess errors)
>>+UNRESOLVED: g++.old-deja/g++.other/headers1.C  -std=c++98 compilation failed to produce executable
>>
>>Excess errors:
>>/var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/bits/stl_map.h:122:21: error: 'is_same' has not been declared
>>/var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/bits/stl_map.h:122:28: error: expected ',' or '...' before '<' token
>>/var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/bits/stl_multimap.h:121:21: error: 'is_same' has not been declared
>>/var/gcc/regression/trunk/11-gcc/build/i386-pc-solaris2.11/libstdc++-v3/include/bits/stl_multimap.h:121:28:
>>error: expected ',' or '...' before '<' token
>>
>>+FAIL: g++.old-deja/g++.robertl/eb109.C  -std=c++98 (test for excess errors)
>>
>>+FAIL: g++.dg/tree-ssa/copyprop.C   (test for excess errors)
>>
>>Same error, seen everywhere (i386-pc-solaris2.11, sparc-sun-solaris2.11,
>>aarch64-unknown-linux-gnu, x86_64-pc-linux-gnu, ...).
>
>Doh. In those files the existing static_assert wasn't guarded by a
>check for C++11 or later. I'm testing this patch.

Committed to trunk. Sorry about that.
Jonathan Wakely June 6, 2019, 1:36 p.m. UTC | #4
On 03/06/19 14:23 +0100, Jonathan Wakely wrote:
>In previous standards it is undefined for a container and its allocator
>to have a different value_type. Libstdc++ has traditionally allowed it
>as an extension, automatically rebinding the allocator to the
>container's value_type. Since GCC 8.1 that extension has been disabled
>for C++11 and later when __STRICT_ANSI__ is defined (i.e. for
>-std=c++11, -std=c++14, -std=c++17 and -std=c++2a).
>
>Since the acceptance of P1463R1 into the C++2a draft an incorrect
>allocator::value_type now requires a diagnostic. This patch implements
>that by enabling the static_assert for -std=gnu++2a as well.
>
>	* doc/xml/manual/status_cxx2020.xml: Document P1463R1 status.
>	* include/bits/forward_list.h [__cplusplus > 201703]: Enable
>	allocator::value_type assertion for C++2a.
>	* include/bits/hashtable.h: Likewise.
>	* include/bits/stl_deque.h: Likewise.
>	* include/bits/stl_list.h: Likewise.
>	* include/bits/stl_map.h: Likewise.
>	* include/bits/stl_multimap.h: Likewise.
>	* include/bits/stl_multiset.h: Likewise.
>	* include/bits/stl_set.h: Likewise.
>	* include/bits/stl_vector.h: Likewise.
>	* testsuite/23_containers/deque/48101-3_neg.cc: New test.
>	* testsuite/23_containers/forward_list/48101-3_neg.cc: New test.
>	* testsuite/23_containers/list/48101-3_neg.cc: New test.
>	* testsuite/23_containers/map/48101-3_neg.cc: New test.
>	* testsuite/23_containers/multimap/48101-3_neg.cc: New test.
>	* testsuite/23_containers/multiset/48101-3_neg.cc: New test.
>	* testsuite/23_containers/set/48101-3_neg.cc: New test.
>	* testsuite/23_containers/unordered_map/48101-3_neg.cc: New test.
>	* testsuite/23_containers/unordered_multimap/48101-3_neg.cc: New test.
>	* testsuite/23_containers/unordered_multiset/48101-3_neg.cc: New test.
>	* testsuite/23_containers/unordered_set/48101-3_neg.cc: New test.
>	* testsuite/23_containers/vector/48101-3_neg.cc: New test.

The tests for this extension now fail when run with -std=gnu++2a. This
fixes them. Tested x86_64-linux with various -std options. Committed
to trunk.
Jonathan Wakely June 6, 2019, 3:36 p.m. UTC | #5
On 06/06/19 14:36 +0100, Jonathan Wakely wrote:
>On 03/06/19 14:23 +0100, Jonathan Wakely wrote:
>>In previous standards it is undefined for a container and its allocator
>>to have a different value_type. Libstdc++ has traditionally allowed it
>>as an extension, automatically rebinding the allocator to the
>>container's value_type. Since GCC 8.1 that extension has been disabled
>>for C++11 and later when __STRICT_ANSI__ is defined (i.e. for
>>-std=c++11, -std=c++14, -std=c++17 and -std=c++2a).
>>
>>Since the acceptance of P1463R1 into the C++2a draft an incorrect
>>allocator::value_type now requires a diagnostic. This patch implements
>>that by enabling the static_assert for -std=gnu++2a as well.
>>
>>	* doc/xml/manual/status_cxx2020.xml: Document P1463R1 status.
>>	* include/bits/forward_list.h [__cplusplus > 201703]: Enable
>>	allocator::value_type assertion for C++2a.
>>	* include/bits/hashtable.h: Likewise.
>>	* include/bits/stl_deque.h: Likewise.
>>	* include/bits/stl_list.h: Likewise.
>>	* include/bits/stl_map.h: Likewise.
>>	* include/bits/stl_multimap.h: Likewise.
>>	* include/bits/stl_multiset.h: Likewise.
>>	* include/bits/stl_set.h: Likewise.
>>	* include/bits/stl_vector.h: Likewise.
>>	* testsuite/23_containers/deque/48101-3_neg.cc: New test.
>>	* testsuite/23_containers/forward_list/48101-3_neg.cc: New test.
>>	* testsuite/23_containers/list/48101-3_neg.cc: New test.
>>	* testsuite/23_containers/map/48101-3_neg.cc: New test.
>>	* testsuite/23_containers/multimap/48101-3_neg.cc: New test.
>>	* testsuite/23_containers/multiset/48101-3_neg.cc: New test.
>>	* testsuite/23_containers/set/48101-3_neg.cc: New test.
>>	* testsuite/23_containers/unordered_map/48101-3_neg.cc: New test.
>>	* testsuite/23_containers/unordered_multimap/48101-3_neg.cc: New test.
>>	* testsuite/23_containers/unordered_multiset/48101-3_neg.cc: New test.
>>	* testsuite/23_containers/unordered_set/48101-3_neg.cc: New test.
>>	* testsuite/23_containers/vector/48101-3_neg.cc: New test.
>
>The tests for this extension now fail when run with -std=gnu++2a. This
>fixes them. Tested x86_64-linux with various -std options. Committed
>to trunk.

I missed a couple more tests that fail with -std=gnu++2a.

Tested x86_64-linux, committed to trunk.
diff mbox series

Patch

diff --git a/libstdc++-v3/doc/xml/manual/status_cxx2020.xml b/libstdc++-v3/doc/xml/manual/status_cxx2020.xml
index 8a17747e3bd..4b0336931f4 100644
--- a/libstdc++-v3/doc/xml/manual/status_cxx2020.xml
+++ b/libstdc++-v3/doc/xml/manual/status_cxx2020.xml
@@ -951,6 +951,21 @@  Feature-testing recommendations for C++</link>.
       <entry align="center"> 9.1 </entry>
       <entry />
     </row>
+
+    <row>
+      <entry>
+        Mandating the Standard Library:
+        Clause 21 - Containers library
+      </entry>
+      <entry>
+        <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1463r1.pdf">
+        P1463R1
+	</link>
+      </entry>
+      <entry align="center"> 10 </entry>
+      <entry/>
+    </row>
+
   </tbody>
 </tgroup>
 </table>
diff --git a/libstdc++-v3/include/bits/forward_list.h b/libstdc++-v3/include/bits/forward_list.h
index 4c277845a51..e686283a432 100644
--- a/libstdc++-v3/include/bits/forward_list.h
+++ b/libstdc++-v3/include/bits/forward_list.h
@@ -421,7 +421,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     {
       static_assert(is_same<typename remove_cv<_Tp>::type, _Tp>::value,
 	  "std::forward_list must have a non-const, non-volatile value_type");
-#ifdef __STRICT_ANSI__
+#if __cplusplus > 201703L || defined __STRICT_ANSI__
       static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
 	  "std::forward_list must have the same value_type as its allocator");
 #endif
diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h
index ab24b5bb537..384e39877f2 100644
--- a/libstdc++-v3/include/bits/hashtable.h
+++ b/libstdc++-v3/include/bits/hashtable.h
@@ -188,7 +188,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
     {
       static_assert(is_same<typename remove_cv<_Value>::type, _Value>::value,
 	  "unordered container must have a non-const, non-volatile value_type");
-#ifdef __STRICT_ANSI__
+#if __cplusplus > 201703L || defined __STRICT_ANSI__
       static_assert(is_same<typename _Alloc::value_type, _Value>{},
 	  "unordered container must have the same value_type as its allocator");
 #endif
diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h
index 7dcb53823c4..ac76d681ff0 100644
--- a/libstdc++-v3/include/bits/stl_deque.h
+++ b/libstdc++-v3/include/bits/stl_deque.h
@@ -824,7 +824,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
       static_assert(is_same<typename remove_cv<_Tp>::type, _Tp>::value,
 	  "std::deque must have a non-const, non-volatile value_type");
-# ifdef __STRICT_ANSI__
+# if __cplusplus > 201703L || defined __STRICT_ANSI__
       static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
 	  "std::deque must have the same value_type as its allocator");
 # endif
diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h
index 68bab94af1e..701982538df 100644
--- a/libstdc++-v3/include/bits/stl_list.h
+++ b/libstdc++-v3/include/bits/stl_list.h
@@ -563,7 +563,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CXX11
 #if __cplusplus >= 201103L
       static_assert(is_same<typename remove_cv<_Tp>::type, _Tp>::value,
 	  "std::list must have a non-const, non-volatile value_type");
-# ifdef __STRICT_ANSI__
+# if __cplusplus > 201703L || defined __STRICT_ANSI__
       static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
 	  "std::list must have the same value_type as its allocator");
 # endif
diff --git a/libstdc++-v3/include/bits/stl_map.h b/libstdc++-v3/include/bits/stl_map.h
index 322d0a8290a..b1083d572d6 100644
--- a/libstdc++-v3/include/bits/stl_map.h
+++ b/libstdc++-v3/include/bits/stl_map.h
@@ -118,7 +118,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       __glibcxx_class_requires2(value_type, _Alloc_value_type, _SameTypeConcept)
 #endif
 
-#if __cplusplus >= 201103L && defined(__STRICT_ANSI__)
+#if __cplusplus > 201703L || defined __STRICT_ANSI__
       static_assert(is_same<typename _Alloc::value_type, value_type>::value,
 	  "std::map must have the same value_type as its allocator");
 #endif
diff --git a/libstdc++-v3/include/bits/stl_multimap.h b/libstdc++-v3/include/bits/stl_multimap.h
index 4c4ccad3ac0..bb4aece96bf 100644
--- a/libstdc++-v3/include/bits/stl_multimap.h
+++ b/libstdc++-v3/include/bits/stl_multimap.h
@@ -117,7 +117,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       __glibcxx_class_requires2(value_type, _Alloc_value_type, _SameTypeConcept)
 #endif
 
-#if __cplusplus >= 201103L && defined(__STRICT_ANSI__)
+#if __cplusplus > 201703L || defined __STRICT_ANSI__
       static_assert(is_same<typename _Alloc::value_type, value_type>::value,
 	  "std::multimap must have the same value_type as its allocator");
 #endif
diff --git a/libstdc++-v3/include/bits/stl_multiset.h b/libstdc++-v3/include/bits/stl_multiset.h
index af733ea34dc..96fa14e2afa 100644
--- a/libstdc++-v3/include/bits/stl_multiset.h
+++ b/libstdc++-v3/include/bits/stl_multiset.h
@@ -109,7 +109,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
       static_assert(is_same<typename remove_cv<_Key>::type, _Key>::value,
 	  "std::multiset must have a non-const, non-volatile value_type");
-# ifdef __STRICT_ANSI__
+# if __cplusplus > 201703L || defined __STRICT_ANSI__
       static_assert(is_same<typename _Alloc::value_type, _Key>::value,
 	  "std::multiset must have the same value_type as its allocator");
 # endif
diff --git a/libstdc++-v3/include/bits/stl_set.h b/libstdc++-v3/include/bits/stl_set.h
index 3131a7974b0..279b9705d78 100644
--- a/libstdc++-v3/include/bits/stl_set.h
+++ b/libstdc++-v3/include/bits/stl_set.h
@@ -107,7 +107,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
       static_assert(is_same<typename remove_cv<_Key>::type, _Key>::value,
 	  "std::set must have a non-const, non-volatile value_type");
-# ifdef __STRICT_ANSI__
+# if __cplusplus > 201703L || defined __STRICT_ANSI__
       static_assert(is_same<typename _Alloc::value_type, _Key>::value,
 	  "std::set must have the same value_type as its allocator");
 # endif
diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h
index dd9382d254d..d33e589498a 100644
--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -397,7 +397,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 #if __cplusplus >= 201103L
       static_assert(is_same<typename remove_cv<_Tp>::type, _Tp>::value,
 	  "std::vector must have a non-const, non-volatile value_type");
-# ifdef __STRICT_ANSI__
+# if __cplusplus > 201703L || defined __STRICT_ANSI__
       static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
 	  "std::vector must have the same value_type as its allocator");
 # endif
diff --git a/libstdc++-v3/testsuite/23_containers/deque/48101-3_neg.cc b/libstdc++-v3/testsuite/23_containers/deque/48101-3_neg.cc
new file mode 100644
index 00000000000..724b3de6a03
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/deque/48101-3_neg.cc
@@ -0,0 +1,29 @@ 
+// Copyright (C) 2017-2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <deque>
+
+void
+test01()
+{
+  std::deque<int, std::allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/48101-3_neg.cc b/libstdc++-v3/testsuite/23_containers/forward_list/48101-3_neg.cc
new file mode 100644
index 00000000000..d0e56f59494
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/48101-3_neg.cc
@@ -0,0 +1,29 @@ 
+// Copyright (C) 2017-2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <forward_list>
+
+void
+test01()
+{
+  std::forward_list<int, std::allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/list/48101-3_neg.cc b/libstdc++-v3/testsuite/23_containers/list/48101-3_neg.cc
new file mode 100644
index 00000000000..ce32e9ced82
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/list/48101-3_neg.cc
@@ -0,0 +1,29 @@ 
+// Copyright (C) 2017-2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <list>
+
+void
+test01()
+{
+  std::list<int, std::allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/map/48101-3_neg.cc b/libstdc++-v3/testsuite/23_containers/map/48101-3_neg.cc
new file mode 100644
index 00000000000..dfce9c2179c
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/map/48101-3_neg.cc
@@ -0,0 +1,29 @@ 
+// Copyright (C) 2017-2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <map>
+
+void
+test01()
+{
+  std::map<int, int, std::less<int>, std::allocator<int>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/multimap/48101-3_neg.cc b/libstdc++-v3/testsuite/23_containers/multimap/48101-3_neg.cc
new file mode 100644
index 00000000000..77769498548
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/multimap/48101-3_neg.cc
@@ -0,0 +1,29 @@ 
+// Copyright (C) 2017-2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <map>
+
+void
+test01()
+{
+  std::multimap<int, int, std::less<int>, std::allocator<int>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/multiset/48101-3_neg.cc b/libstdc++-v3/testsuite/23_containers/multiset/48101-3_neg.cc
new file mode 100644
index 00000000000..209a1d5deeb
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/multiset/48101-3_neg.cc
@@ -0,0 +1,29 @@ 
+// Copyright (C) 2017-2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <set>
+
+void
+test01()
+{
+  std::multiset<int, std::less<int>, std::allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/set/48101-3_neg.cc b/libstdc++-v3/testsuite/23_containers/set/48101-3_neg.cc
new file mode 100644
index 00000000000..75777370a3a
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/set/48101-3_neg.cc
@@ -0,0 +1,29 @@ 
+// Copyright (C) 2017-2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <set>
+
+void
+test01()
+{
+  std::set<int, std::less<int>, std::allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/48101-3_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/48101-3_neg.cc
new file mode 100644
index 00000000000..98bcd8c755b
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/unordered_map/48101-3_neg.cc
@@ -0,0 +1,30 @@ 
+// Copyright (C) 2017-2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <unordered_map>
+
+void
+test01()
+{
+  using namespace std;
+  unordered_map<int, int, hash<int>, equal_to<int>, allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/48101-3_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/48101-3_neg.cc
new file mode 100644
index 00000000000..3bda27b8354
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/48101-3_neg.cc
@@ -0,0 +1,30 @@ 
+// Copyright (C) 2017-2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <unordered_map>
+
+void
+test01()
+{
+  using namespace std;
+  unordered_multimap<int, int, hash<int>, equal_to<int>, allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/48101-3_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/48101-3_neg.cc
new file mode 100644
index 00000000000..620c9b703bd
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/48101-3_neg.cc
@@ -0,0 +1,30 @@ 
+// Copyright (C) 2017-2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <unordered_set>
+
+void
+test01()
+{
+  using namespace std;
+  unordered_multiset<int, hash<int>, equal_to<int>, allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/48101-3_neg.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/48101-3_neg.cc
new file mode 100644
index 00000000000..c226c5236f8
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/unordered_set/48101-3_neg.cc
@@ -0,0 +1,30 @@ 
+// Copyright (C) 2017-2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <unordered_set>
+
+void
+test01()
+{
+  using namespace std;
+  unordered_set<int, hash<int>, equal_to<int>, allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/23_containers/vector/48101-3_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/48101-3_neg.cc
new file mode 100644
index 00000000000..2317efa1516
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/48101-3_neg.cc
@@ -0,0 +1,29 @@ 
+// Copyright (C) 2017-2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <vector>
+
+void
+test01()
+{
+  std::vector<int, std::allocator<long>> c;
+}
+
+// { dg-error "same value_type as its allocator" "" { target *-*-* } 0 }