diff mbox

RFA (tree-inline): PATCH for more C++14 constexpr support

Message ID 546A3B28.4030508@redhat.com
State New
Headers show

Commit Message

Jason Merrill Nov. 17, 2014, 6:15 p.m. UTC
On 11/17/2014 05:29 AM, Richard Biener wrote:
> can you rename it to copy_fn please?  It really copies parameter and
> result and then the body.
>
> Ok with that change.

Done.  Here's what I'm checking in, along with a second patch to enable 
the new code for C++11 as well:

Comments

Andreas Schwab Nov. 18, 2014, 2:26 p.m. UTC | #1
Jason Merrill <jason@redhat.com> writes:

> commit e52e82e56507d1de1932abcafd80683c4dc00d1e
> Author: Jason Merrill <jason@redhat.com>
> Date:   Sun Nov 16 17:14:12 2014 -0500
>
>     	* constexpr.c (use_new_call): Always use new call handling.
>
> diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
> index 57d0c46..8881271 100644
> --- a/gcc/cp/constexpr.c
> +++ b/gcc/cp/constexpr.c
> @@ -1021,8 +1021,8 @@ adjust_temp_type (tree type, tree temp)
>  }
>  
>  /* True if we want to use the new handling of constexpr calls based on
> -   DECL_SAVED_TREE.  Currently only active for C++14 mode.  */
> -#define use_new_call (cxx_dialect >= cxx14)
> +   DECL_SAVED_TREE.  */
> +#define use_new_call true
>  
>  /* Subroutine of cxx_eval_call_expression.
>     We are processing a call expression (either CALL_EXPR or

FAIL: 18_support/numeric_limits/requirements/constexpr_functions.cc (test for excess errors)

$ gcc/xg++ -shared-libgcc -Bgcc -nostdinc++ -Lm68k-linux/libstdc++-v3/src -Lm68k-linux/libstdc++-v3/src/.libs -Lm68k-linux/libstdc++-v3/libsupc++/.libs -B/daten/cross/m68k-linux/m68k-linux/bin/ -B/daten/cross/m68k-linux/m68k-linux/lib/ -isystem /daten/cross/m68k-linux/m68k-linux/include -isystem /daten/cross/m68k-linux/m68k-linux/sys-include -Bm68k-linux/./libstdc++-v3/src/.libs -D_GLIBCXX_ASSERT -fmessage-length=0 -ffunction-sections -fdata-sections -O2 -g -D_GNU_SOURCE -DLOCALEDIR="." -nostdinc++ -Im68k-linux/libstdc++-v3/include/m68k-linux -Im68k-linux/libstdc++-v3/include -I../libstdc++-v3/libsupc++ -I../libstdc++-v3/include/backward -I../libstdc++-v3/testsuite/util ../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc -std=gnu++14 -S -o constexpr_functions.s
In file included from ../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc:21:0:
../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc: In instantiation of ‘void __gnu_test::constexpr_member_functions::operator()()::_Concept::__constraint() [with _Ttesttype = std::numeric_limits<char>; _Tbasetype = char]’:
../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc:55:2:   required from ‘void __gnu_test::constexpr_member_functions::operator()() [with _Ttesttype = std::numeric_limits<char>; _Tbasetype = char]’
m68k-linux/libstdc++-v3/include/ext/typelist.h:197:2:   required from ‘void __gnu_cxx::typelist::detail::apply_generator2_<Gn, __gnu_cxx::typelist::chain<Hd, Tl>, __gnu_cxx::typelist::chain<Hd2, TlV> >::operator()(Gn&) [with Gn = __gnu_test::constexpr_member_functions; Hd1 = std::numeric_limits<char>; TlT = __gnu_cxx::typelist::chain<std::numeric_limits<signed char>, __gnu_cxx::typelist::chain<std::numeric_limits<unsigned char>, __gnu_cxx::typelist::chain<std::numeric_limits<short int>, __gnu_cxx::typelist::chain<std::numeric_limits<short unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<int>, __gnu_cxx::typelist::chain<std::numeric_limits<unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<long int>, __gnu_cxx::typelist::chain<std::numeric_limits<long unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<long long int>, __gnu_cxx::typelist::chain<std::numeric_limits<long long unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<wchar_t>, __gnu_cxx::typelist::chain<std::numeric_limits<char16_t>, __gnu_cxx::typelist::chain<std::numeric_limits<char32_t>, __gnu_cxx::typelist::null_type> > > > > > > > > > > > >; Hd2 = char; TlV = __gnu_cxx::typelist::chain<signed char, __gnu_cxx::typelist::chain<unsigned char, __gnu_cxx::typelist::chain<short int, __gnu_cxx::typelist::chain<short unsigned int, __gnu_cxx::typelist::chain<int, __gnu_cxx::typelist::chain<unsigned int, __gnu_cxx::typelist::chain<long int, __gnu_cxx::typelist::chain<long unsigned int, __gnu_cxx::typelist::chain<long long int, __gnu_cxx::typelist::chain<long long unsigned int, __gnu_cxx::typelist::chain<wchar_t, __gnu_cxx::typelist::chain<char16_t, __gnu_cxx::typelist::chain<char32_t, __gnu_cxx::typelist::null_type> > > > > > > > > > > > >]’
m68k-linux/libstdc++-v3/include/ext/typelist.h:199:6:   required from ‘void __gnu_cxx::typelist::detail::apply_generator2_<Gn, __gnu_cxx::typelist::chain<Hd, Tl>, __gnu_cxx::typelist::chain<Hd2, TlV> >::operator()(Gn&) [with Gn = __gnu_test::constexpr_member_functions; Hd1 = std::numeric_limits<bool>; TlT = __gnu_cxx::typelist::chain<std::numeric_limits<char>, __gnu_cxx::typelist::chain<std::numeric_limits<signed char>, __gnu_cxx::typelist::chain<std::numeric_limits<unsigned char>, __gnu_cxx::typelist::chain<std::numeric_limits<short int>, __gnu_cxx::typelist::chain<std::numeric_limits<short unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<int>, __gnu_cxx::typelist::chain<std::numeric_limits<unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<long int>, __gnu_cxx::typelist::chain<std::numeric_limits<long unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<long long int>, __gnu_cxx::typelist::chain<std::numeric_limits<long long unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<wchar_t>, __gnu_cxx::typelist::chain<std::numeric_limits<char16_t>, __gnu_cxx::typelist::chain<std::numeric_limits<char32_t>, __gnu_cxx::typelist::null_type> > > > > > > > > > > > > >; Hd2 = bool; TlV = __gnu_cxx::typelist::chain<char, __gnu_cxx::typelist::chain<signed char, __gnu_cxx::typelist::chain<unsigned char, __gnu_cxx::typelist::chain<short int, __gnu_cxx::typelist::chain<short unsigned int, __gnu_cxx::typelist::chain<int, __gnu_cxx::typelist::chain<unsigned int, __gnu_cxx::typelist::chain<long int, __gnu_cxx::typelist::chain<long unsigned int, __gnu_cxx::typelist::chain<long long int, __gnu_cxx::typelist::chain<long long unsigned int, __gnu_cxx::typelist::chain<wchar_t, __gnu_cxx::typelist::chain<char16_t, __gnu_cxx::typelist::chain<char32_t, __gnu_cxx::typelist::null_type> > > > > > > > > > > > > >]’
m68k-linux/libstdc++-v3/include/ext/typelist.h:424:8:   required from ‘void __gnu_cxx::typelist::apply_generator(Gn&, TypelistT, TypelistV) [with Gn = __gnu_test::constexpr_member_functions; TypelistT = __gnu_cxx::typelist::node<__gnu_cxx::typelist::chain<std::numeric_limits<bool>, __gnu_cxx::typelist::chain<std::numeric_limits<char>, __gnu_cxx::typelist::chain<std::numeric_limits<signed char>, __gnu_cxx::typelist::chain<std::numeric_limits<unsigned char>, __gnu_cxx::typelist::chain<std::numeric_limits<short int>, __gnu_cxx::typelist::chain<std::numeric_limits<short unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<int>, __gnu_cxx::typelist::chain<std::numeric_limits<unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<long int>, __gnu_cxx::typelist::chain<std::numeric_limits<long unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<long long int>, __gnu_cxx::typelist::chain<std::numeric_limits<long long unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<wchar_t>, __gnu_cxx::typelist::chain<std::numeric_limits<char16_t>, __gnu_cxx::typelist::chain<std::numeric_limits<char32_t>, __gnu_cxx::typelist::null_type> > > > > > > > > > > > > > > >; TypelistV = __gnu_cxx::typelist::node<__gnu_cxx::typelist::chain<bool, __gnu_cxx::typelist::chain<char, __gnu_cxx::typelist::chain<signed char, __gnu_cxx::typelist::chain<unsigned char, __gnu_cxx::typelist::chain<short int, __gnu_cxx::typelist::chain<short unsigned int, __gnu_cxx::typelist::chain<int, __gnu_cxx::typelist::chain<unsigned int, __gnu_cxx::typelist::chain<long int, __gnu_cxx::typelist::chain<long unsigned int, __gnu_cxx::typelist::chain<long long int, __gnu_cxx::typelist::chain<long long unsigned int, __gnu_cxx::typelist::chain<wchar_t, __gnu_cxx::typelist::chain<char16_t, __gnu_cxx::typelist::chain<char32_t, __gnu_cxx::typelist::null_type> > > > > > > > > > > > > > > >]’
../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc:68:50:   required from here
../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc:37:25:   in constexpr expansion of ‘std::numeric_limits<char>::min()’
m68k-linux/libstdc++-v3/include/limits:456:44: error: ‘(1u * 8u)’ is not a constant expression
       min() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_min(char); }
                                            ^
../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc:39:25:   in constexpr expansion of ‘std::numeric_limits<char>::max()’
m68k-linux/libstdc++-v3/include/limits:459:44: error: ‘(1u * 8u)’ is not a constant expression
       max() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_max(char); }
                                            ^
../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc:41:28:   in constexpr expansion of ‘std::numeric_limits<char>::lowest()’
m68k-linux/libstdc++-v3/include/limits:463:37:   in constexpr expansion of ‘std::numeric_limits<char>::min()’
m68k-linux/libstdc++-v3/include/limits:456:44: error: ‘(1u * 8u)’ is not a constant expression
       min() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_min(char); }
                                            ^
../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc: In instantiation of ‘void __gnu_test::constexpr_member_functions::operator()()::_Concept::__constraint() [with _Ttesttype = std::numeric_limits<wchar_t>; _Tbasetype = wchar_t]’:
../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc:55:2:   required from ‘void __gnu_test::constexpr_member_functions::operator()() [with _Ttesttype = std::numeric_limits<wchar_t>; _Tbasetype = wchar_t]’
m68k-linux/libstdc++-v3/include/ext/typelist.h:199:6:   recursively required from ‘void __gnu_cxx::typelist::detail::apply_generator2_<Gn, __gnu_cxx::typelist::chain<Hd, Tl>, __gnu_cxx::typelist::chain<Hd2, TlV> >::operator()(Gn&) [with Gn = __gnu_test::constexpr_member_functions; Hd1 = std::numeric_limits<char>; TlT = __gnu_cxx::typelist::chain<std::numeric_limits<signed char>, __gnu_cxx::typelist::chain<std::numeric_limits<unsigned char>, __gnu_cxx::typelist::chain<std::numeric_limits<short int>, __gnu_cxx::typelist::chain<std::numeric_limits<short unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<int>, __gnu_cxx::typelist::chain<std::numeric_limits<unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<long int>, __gnu_cxx::typelist::chain<std::numeric_limits<long unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<long long int>, __gnu_cxx::typelist::chain<std::numeric_limits<long long unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<wchar_t>, __gnu_cxx::typelist::chain<std::numeric_limits<char16_t>, __gnu_cxx::typelist::chain<std::numeric_limits<char32_t>, __gnu_cxx::typelist::null_type> > > > > > > > > > > > >; Hd2 = char; TlV = __gnu_cxx::typelist::chain<signed char, __gnu_cxx::typelist::chain<unsigned char, __gnu_cxx::typelist::chain<short int, __gnu_cxx::typelist::chain<short unsigned int, __gnu_cxx::typelist::chain<int, __gnu_cxx::typelist::chain<unsigned int, __gnu_cxx::typelist::chain<long int, __gnu_cxx::typelist::chain<long unsigned int, __gnu_cxx::typelist::chain<long long int, __gnu_cxx::typelist::chain<long long unsigned int, __gnu_cxx::typelist::chain<wchar_t, __gnu_cxx::typelist::chain<char16_t, __gnu_cxx::typelist::chain<char32_t, __gnu_cxx::typelist::null_type> > > > > > > > > > > > >]’
m68k-linux/libstdc++-v3/include/ext/typelist.h:199:6:   required from ‘void __gnu_cxx::typelist::detail::apply_generator2_<Gn, __gnu_cxx::typelist::chain<Hd, Tl>, __gnu_cxx::typelist::chain<Hd2, TlV> >::operator()(Gn&) [with Gn = __gnu_test::constexpr_member_functions; Hd1 = std::numeric_limits<bool>; TlT = __gnu_cxx::typelist::chain<std::numeric_limits<char>, __gnu_cxx::typelist::chain<std::numeric_limits<signed char>, __gnu_cxx::typelist::chain<std::numeric_limits<unsigned char>, __gnu_cxx::typelist::chain<std::numeric_limits<short int>, __gnu_cxx::typelist::chain<std::numeric_limits<short unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<int>, __gnu_cxx::typelist::chain<std::numeric_limits<unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<long int>, __gnu_cxx::typelist::chain<std::numeric_limits<long unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<long long int>, __gnu_cxx::typelist::chain<std::numeric_limits<long long unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<wchar_t>, __gnu_cxx::typelist::chain<std::numeric_limits<char16_t>, __gnu_cxx::typelist::chain<std::numeric_limits<char32_t>, __gnu_cxx::typelist::null_type> > > > > > > > > > > > > >; Hd2 = bool; TlV = __gnu_cxx::typelist::chain<char, __gnu_cxx::typelist::chain<signed char, __gnu_cxx::typelist::chain<unsigned char, __gnu_cxx::typelist::chain<short int, __gnu_cxx::typelist::chain<short unsigned int, __gnu_cxx::typelist::chain<int, __gnu_cxx::typelist::chain<unsigned int, __gnu_cxx::typelist::chain<long int, __gnu_cxx::typelist::chain<long unsigned int, __gnu_cxx::typelist::chain<long long int, __gnu_cxx::typelist::chain<long long unsigned int, __gnu_cxx::typelist::chain<wchar_t, __gnu_cxx::typelist::chain<char16_t, __gnu_cxx::typelist::chain<char32_t, __gnu_cxx::typelist::null_type> > > > > > > > > > > > > >]’
m68k-linux/libstdc++-v3/include/ext/typelist.h:424:8:   required from ‘void __gnu_cxx::typelist::apply_generator(Gn&, TypelistT, TypelistV) [with Gn = __gnu_test::constexpr_member_functions; TypelistT = __gnu_cxx::typelist::node<__gnu_cxx::typelist::chain<std::numeric_limits<bool>, __gnu_cxx::typelist::chain<std::numeric_limits<char>, __gnu_cxx::typelist::chain<std::numeric_limits<signed char>, __gnu_cxx::typelist::chain<std::numeric_limits<unsigned char>, __gnu_cxx::typelist::chain<std::numeric_limits<short int>, __gnu_cxx::typelist::chain<std::numeric_limits<short unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<int>, __gnu_cxx::typelist::chain<std::numeric_limits<unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<long int>, __gnu_cxx::typelist::chain<std::numeric_limits<long unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<long long int>, __gnu_cxx::typelist::chain<std::numeric_limits<long long unsigned int>, __gnu_cxx::typelist::chain<std::numeric_limits<wchar_t>, __gnu_cxx::typelist::chain<std::numeric_limits<char16_t>, __gnu_cxx::typelist::chain<std::numeric_limits<char32_t>, __gnu_cxx::typelist::null_type> > > > > > > > > > > > > > > >; TypelistV = __gnu_cxx::typelist::node<__gnu_cxx::typelist::chain<bool, __gnu_cxx::typelist::chain<char, __gnu_cxx::typelist::chain<signed char, __gnu_cxx::typelist::chain<unsigned char, __gnu_cxx::typelist::chain<short int, __gnu_cxx::typelist::chain<short unsigned int, __gnu_cxx::typelist::chain<int, __gnu_cxx::typelist::chain<unsigned int, __gnu_cxx::typelist::chain<long int, __gnu_cxx::typelist::chain<long unsigned int, __gnu_cxx::typelist::chain<long long int, __gnu_cxx::typelist::chain<long long unsigned int, __gnu_cxx::typelist::chain<wchar_t, __gnu_cxx::typelist::chain<char16_t, __gnu_cxx::typelist::chain<char32_t, __gnu_cxx::typelist::null_type> > > > > > > > > > > > > > > >]’
../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc:68:50:   required from here
../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc:37:25:   in constexpr expansion of ‘std::numeric_limits<wchar_t>::min()’
m68k-linux/libstdc++-v3/include/limits:666:44: error: ‘(4u * 8u)’ is not a constant expression
       min() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_min (wchar_t); }
                                            ^
../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc:39:25:   in constexpr expansion of ‘std::numeric_limits<wchar_t>::max()’
m68k-linux/libstdc++-v3/include/limits:669:44: error: ‘(4u * 8u)’ is not a constant expression
       max() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_max (wchar_t); }
                                            ^
../libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc:41:28:   in constexpr expansion of ‘std::numeric_limits<wchar_t>::lowest()’
m68k-linux/libstdc++-v3/include/limits:673:37:   in constexpr expansion of ‘std::numeric_limits<wchar_t>::min()’
m68k-linux/libstdc++-v3/include/limits:666:44: error: ‘(4u * 8u)’ is not a constant expression
       min() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_min (wchar_t); }
                                            ^

Andreas.
Kyrylo Tkachov Nov. 18, 2014, 3:26 p.m. UTC | #2
On 17/11/14 18:15, Jason Merrill wrote:
> On 11/17/2014 05:29 AM, Richard Biener wrote:
>> can you rename it to copy_fn please?  It really copies parameter and
>> result and then the body.
>>
>> Ok with that change.
> Done.  Here's what I'm checking in, along with a second patch to enable
> the new code for C++11 as well:

Hi Jason,

These broke building libstdc++ on arm-none-eabi.
I've filed https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63936 for it.

Cheers,
Kyrill
diff mbox

Patch

commit e52e82e56507d1de1932abcafd80683c4dc00d1e
Author: Jason Merrill <jason@redhat.com>
Date:   Sun Nov 16 17:14:12 2014 -0500

    	* constexpr.c (use_new_call): Always use new call handling.

diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 57d0c46..8881271 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -1021,8 +1021,8 @@  adjust_temp_type (tree type, tree temp)
 }
 
 /* True if we want to use the new handling of constexpr calls based on
-   DECL_SAVED_TREE.  Currently only active for C++14 mode.  */
-#define use_new_call (cxx_dialect >= cxx14)
+   DECL_SAVED_TREE.  */
+#define use_new_call true
 
 /* Subroutine of cxx_eval_call_expression.
    We are processing a call expression (either CALL_EXPR or