PR c++/67876 - [6 Regression] ICE when compiling Firefox 38
authorMartin Sebor <msebor@redhat.com>
Thu, 26 Nov 2015 01:52:04 +0000 (01:52 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Thu, 26 Nov 2015 01:52:04 +0000 (18:52 -0700)
gcc/cp
* pt.c (convert_template_argument): Make sure number of tree
operands is greater than zero before attempting to extract one.

gcc/testsuite/
* g++.dg/pr67876.C: New test.

From-SVN: r230924

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

index 52ca12f77f9cb64503e39ecec86dfe49c870844f..82a29a3b0f63b36ba995535ba3540d0ffccb1730 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-25  Martin Sebor  <msebor@redhat.com>
+
+       PR c++/67876
+       * pt.c (convert_template_argument): Make sure number of tree
+       operands is greater than zero before attempting to extract one.
+
 2015-11-25  Ryan Burn  <contact@rnburn.com>
 
        PR c++/68434
        (cp_parser_pragma): Adjust omp_declare_simd checking.  Call
        cp_ensure_no_oacc_routine.
        (cp_parser_pragma): Add OpenACC routine handling.
-       
+
 2015-11-08  Martin Sebor  <msebor@redhat.com>
 
-       PR c++/67942 
+       PR c++/67942
        * cp/init.c (warn_placement_new_too_small): Convert integer
        operand of POINTER_PLUS_EXPR to ssize_t to determine its signed
        value.
index 2432283732625b9a905d63ad34f823a4dd00061e..5befd644c098082468f7d135b572ea029d829c4c 100644 (file)
@@ -7234,6 +7234,7 @@ convert_template_argument (tree parm,
           if (TREE_CODE (TREE_TYPE (inner)) == REFERENCE_TYPE
               && TREE_CODE (TREE_TYPE (TREE_TYPE (inner))) == FUNCTION_TYPE
               && TREE_CODE (TREE_TYPE (inner)) == REFERENCE_TYPE
+              && 0 < TREE_OPERAND_LENGTH (inner)
               && reject_gcc_builtin (TREE_OPERAND (inner, 0)))
               return error_mark_node;
         }
index 41804b98efcb0b2225978e50c676d2409c0dd422..9d022fce86be8c1971c5a5239a40e5ba4fa8c5c6 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-25  Martin Sebor  <msebor@redhat.com>
+
+       PR c++/67876
+       * g++.dg/pr67876.C: New test.
+
 2015-11-25  Aditya Kumar  <aditya.k7@samsung.com>
            Sebastian Pop  <s.pop@samsung.com>
 
diff --git a/gcc/testsuite/g++.dg/pr67876.C b/gcc/testsuite/g++.dg/pr67876.C
new file mode 100644 (file)
index 0000000..5d62b5a
--- /dev/null
@@ -0,0 +1,32 @@
+// PR c++/67876 - [6 Regression] ICE when compiling Firefox 38
+// Caused by a patch for c/66516 - missing diagnostic on taking
+// the address of a builtin function
+// { dg-do compile }
+
+template <class T, void (&F)(T*)>
+struct S { };
+
+extern void foo (int*);
+
+template <class T, void (&F)(T*)>
+void bar (S<T, F>&s) { }
+
+S<int, foo> s;
+
+void foobar (S<int, foo> &s) { bar (s); }
+// PR c++/67876 - [6 Regression] ICE when compiling Firefox 38
+// Caused by a patch for c/66516 - missing diagnostic on taking
+// the address of a builtin function
+// { dg-do compile }
+
+template <class T, void (&F)(T*)>
+struct S { };
+
+extern void foo (int*);
+
+template <class T, void (&F)(T*)>
+void bar (S<T, F>&s) { }
+
+S<int, foo> s;
+
+void foobar (S<int, foo> &s) { bar (s); }