backport: re PR c++/79650 (ICE on invalid c++ code with label arithmetic in convert_nontype_argument (pt.c:6515))
Backported from mainline 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. * g++.dg/template/pr79650.C: New test. From-SVN: r255727
This commit is contained in:
parent
a9a6b2e8cf
commit
a31d2f7b36
|
@ -1,6 +1,12 @@
|
|||
2017-12-15 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
Backported from mainline
|
||||
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-06 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/80259
|
||||
|
|
15
gcc/cp/pt.c
15
gcc/cp/pt.c
|
@ -6523,7 +6523,20 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
|
|||
return NULL_TREE;
|
||||
/* else cxx_constant_value complained but gave us
|
||||
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));
|
||||
location_t loc = EXPR_LOC_OR_LOC (expr, input_location);
|
||||
error_at (loc, "template argument %qE for type %qT not "
|
||||
"a constant integer", expr, type);
|
||||
return NULL_TREE;
|
||||
}
|
||||
}
|
||||
else
|
||||
return NULL_TREE;
|
||||
|
|
|
@ -4,6 +4,11 @@
|
|||
* gcc.target/i386/avx2-pr80631.c: New test.
|
||||
|
||||
Backported from mainline
|
||||
2017-12-14 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/79650
|
||||
* g++.dg/template/pr79650.C: New test.
|
||||
|
||||
2017-12-12 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/80631
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
// 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" }
|
||||
}
|
Loading…
Reference in New Issue