summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2017-12-15 22:13:37 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2017-12-15 22:13:37 +0000
commit5afa1ebcdaabd6995c1302c9322c23f340ebdc53 (patch)
tree3d8588df333c1139b4a714a6f04bb849d3fb07ad
parent3a62b97d6c1d6e3ebc0763486eaf27dd96342f83 (diff)
downloadgcc-5afa1ebcdaabd6995c1302c9322c23f340ebdc53.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@255727 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/pr79650.C20
4 files changed, 45 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index cbd8a456c66..6a215701759 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 39ed0866229..fb293ee62fb 100644
--- a/gcc/cp/pt.c
+++ b/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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index aa366d96a52..61ba4beb780 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/g++.dg/template/pr79650.C b/gcc/testsuite/g++.dg/template/pr79650.C
new file mode 100644
index 00000000000..72c78140942
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr79650.C
@@ -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" }
+}