This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
g++ 5.4.0 inserting const cast that breaks a constexpr - diagnostics ?
- From: Jason Vas Dias <jason dot vas dot dias at gmail dot com>
- To: gcc-help at gcc dot gnu dot org
- Date: Fri, 7 Jul 2017 20:04:24 +0000
- Subject: g++ 5.4.0 inserting const cast that breaks a constexpr - diagnostics ?
- Authentication-results: sourceware.org; auth=none
Hi -
I have some code that is compiled with no warnings / errors
by g++ 7.1.0 with '-std=gnu++14' , but under g++ 5.4.0 there
is a constexpr function which g++ 5.4.0 is convinced involves
a const cast, but g++ 7.1.0 accepts does not :
'in constexpr expansion of x->f((T)v...))
X.h:134:39: error: '*(const X*)this' is not a constant expression
( I did not write ((T)v) either ...)
but there is NO cast expression anywhere in the file , certainly no
text '(const X*)this' or ((T)v) - this is some compiler generated temporary,
that g++ 5.4.0 is generating, but g++ 7.1.0 does not ; on the line
in question, I am calling a 'constexpr bool f(...) const noexcept' member
function of a const X *:
class X { ... constexpr bool f(..) const noexcept { .. } };
constexpr bool y(const X* x){ ...
134: if ( x->f( ... ) ) ...
}
I would like to be able to compile my constexpr functions under
either g++ 4.9+ or g++ 6+ or g++ 7+ . So far, 7.1.0 is getting it right
(I had to remove 6.3.0 - will rebuild later) .
What did 7.1.0 fix in regards to constexprs / temporary generation ?
Is there any way to get G++ 5.4.0 to print out WHY it thinks a function is not
constexpr ?
ANY compiler debug output / intermediate form that shows the compiler's
thinking or the exact line that is generating the temporary would be
invaluable here, but I can't seem to find any way of generating it .
But I think attempting to generate eg. a GIMP intermediate
file would not show the error since compilation would not get to that stage ?
Is there a preliminary C++ parsing stage / debug mode whose output would show
what is requiring the generation of the temporary ? Before I start trying to
debug g++ with gdb , I thought I'd better ask .
The actual X::f() function is just doing a test on some integer arguments in a
conditional expression and returning a boolean - I just cannot see how it
can possibly involve a (const X*) cast, since it is declared 'bool
f(...) CONST ...' -
obviously 5.4.0 is getting it wrong somehow, but 7.1.0 gets it right - if anyone
with detailed knowledge of what constexpr issues were fixed in 7.1.0 could
point me towards a few possible causes I might be able to figure out a
workaround .
Any responses much appreciated. thanks in advance,
Jason