Commit 9096c2c5 by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/79650 (ICE on invalid c++ code with label arithmetic in…

re PR c++/79650 (ICE on invalid c++ code with label arithmetic in convert_nontype_argument (pt.c:6515))

	PR c++/79650
	* pt.c (convert_nontype_argument): Diagnose
	reduced_constant_expression_p expressions that aren't INTEGER_CST.

	* g++.dg/template/pr79650.C: New test.

From-SVN: r255623
parent 606778c6
2017-12-14 Jakub Jelinek <jakub@redhat.com>
PR c++/79650
* pt.c (convert_nontype_argument): Diagnose
reduced_constant_expression_p expressions that aren't INTEGER_CST.
2017-12-13 Paolo Carlini <paolo.carlini@oracle.com> 2017-12-13 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/81061 PR c++/81061
......
...@@ -6577,7 +6577,19 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) ...@@ -6577,7 +6577,19 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
return NULL_TREE; return NULL_TREE;
/* else cxx_constant_value complained but gave us /* else cxx_constant_value complained but gave us
a real constant, so go ahead. */ a real constant, so go ahead. */
gcc_assert (TREE_CODE (expr) == INTEGER_CST); if (TREE_CODE (expr) != INTEGER_CST)
{
/* Some assemble time constant expressions like
(intptr_t)&&lab1 - (intptr_t)&&lab2 or
4 + (intptr_t)&&var satisfy reduced_constant_expression_p
as we can emit them into .rodata initializers of
variables, yet they can't fold into an INTEGER_CST at
compile time. Refuse them here. */
gcc_checking_assert (reduced_constant_expression_p (expr));
error_at (loc, "template argument %qE for type %qT not "
"a constant integer", expr, type);
return NULL_TREE;
}
} }
else else
return NULL_TREE; return NULL_TREE;
......
2017-12-14 Jakub Jelinek <jakub@redhat.com>
PR c++/79650
* g++.dg/template/pr79650.C: New test.
2017-12-14 Richard Sandiford <richard.sandiford@linaro.org> 2017-12-14 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com> Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com> David Sherwood <david.sherwood@arm.com>
......
// PR c++/79650
// { dg-do compile { target c++11 } }
// { dg-options "" }
typedef __INTPTR_TYPE__ intptr_t;
template<intptr_t> struct A {};
void
foo ()
{
static int a, b;
lab1:
lab2:
A<(intptr_t)&&lab1 - (__INTPTR_TYPE__)&&lab2> c; // { dg-error "not a constant integer" }
A<(intptr_t)&&lab1 - (__INTPTR_TYPE__)&&lab1> d;
A<(intptr_t)&a - (intptr_t)&b> e; // { dg-error "is not a constant expression" }
A<(intptr_t)&a - (intptr_t)&a> f;
A<(intptr_t)sizeof(a) + (intptr_t)&a> g; // { dg-error "not a constant integer" }
A<(intptr_t)&a> h; // { dg-error "conversion from pointer type" }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment