]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR c++/79650 (ICE on invalid c++ code with label arithmetic in convert_n...
authorJakub Jelinek <jakub@redhat.com>
Mon, 25 Jun 2018 17:01:10 +0000 (19:01 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 25 Jun 2018 17:01:10 +0000 (19:01 +0200)
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: r262045

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/pr79650.C [new file with mode: 0644]

index 045e5e127a443a9040c82bde9fb74590c0d4567e..4113b0a394d56581bbbe9fcbb99e2ad6d1b8f454 100644 (file)
@@ -1,6 +1,12 @@
 2018-06-25  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
index 9dbf17ba4d883cc9250f59e250f42d107718e914..3f57c6afc689db98fbfc7a4c6147a07686a28d2e 100644 (file)
@@ -6411,7 +6411,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;
index b9b51dce3921b33849a2d385f6140fbd29530534..ca38ff3f0af9e43324a84679f53701b307cb27b0 100644 (file)
@@ -1,6 +1,11 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2017-12-14  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/79650
+       * g++.dg/template/pr79650.C: New test.
+
        2017-12-08  Joseph Myers  <joseph@codesourcery.com>
                    Alexander Monakov  <amonakov@ispras.ru>
                    Jakub Jelinek  <jakub@redhat.com>
diff --git a/gcc/testsuite/g++.dg/template/pr79650.C b/gcc/testsuite/g++.dg/template/pr79650.C
new file mode 100644 (file)
index 0000000..72c7814
--- /dev/null
@@ -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" }
+}