re PR tree-optimization/67055 (Segmentation fault in fold_builtin_alloca_with_align...
authorRichard Biener <rguenther@suse.de>
Wed, 5 Aug 2015 10:01:12 +0000 (10:01 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 5 Aug 2015 10:01:12 +0000 (10:01 +0000)
2015-08-05  Richard Biener  <rguenther@suse.de>

PR tree-optimization/67055
* tree-ssa-ccp.c (fold_builtin_alloca_with_align): Handle
NULL gimple_block.

* g++.dg/torture/pr67055.C: New testcase.

From-SVN: r226616

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr67055.C [new file with mode: 0644]
gcc/tree-ssa-ccp.c

index f6717cda27504989fdd354df8a3a7e0b69716ac7..ff02e192470772b59a43c4ef7bb9bad44420b5c4 100644 (file)
@@ -1,3 +1,11 @@
+2015-08-05  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/67055
+       * tree-ssa-ccp.c (fold_builtin_alloca_with_align): Handle
+       NULL gimple_block.
+
+       * g++.dg/torture/pr67055.C: New testcase.
+
 2015-08-05  Kirill Yukhin  <kirill.yukhin@intel.com>
 
        * config/i386/i386.md (define_attr "isa"): Addd avx512vl and
index 82aa267d42dd696e171d130e30e34a91b2b7f3ad..e7e74a36b2526b5b2ab28e07dedbadae987b8b7c 100644 (file)
@@ -1,3 +1,8 @@
+2015-08-05  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/67055
+       * g++.dg/torture/pr67055.C: New testcase.
+
 2015-08-05  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/67109
diff --git a/gcc/testsuite/g++.dg/torture/pr67055.C b/gcc/testsuite/g++.dg/torture/pr67055.C
new file mode 100644 (file)
index 0000000..7cbbca2
--- /dev/null
@@ -0,0 +1,44 @@
+// { dg-do compile }
+// { dg-additional-options "-std=c++14" }
+
+namespace std {
+    typedef __SIZE_TYPE__ size_t;
+    struct nothrow_t;
+}
+namespace vespamalloc {
+    void fn1(void *);
+    template <typename> class A {
+    public:
+       static unsigned long fillStack(unsigned long);
+    };
+    template <typename StackRep>
+       unsigned long A<StackRep>::fillStack(unsigned long p1) {
+           void *retAddr[p1];
+           fn1(retAddr);
+       }
+    class B {
+    protected:
+       B(void *);
+    };
+    template <int StackTraceLen> class D : B {
+    public:
+       D() : B(0) {}
+       void alloc(int) { A<int>::fillStack(StackTraceLen); }
+    };
+    template <typename, typename> class C {
+    public:
+       void *malloc(unsigned long);
+    };
+    template <typename MemBlockPtrT, typename ThreadListT>
+       void *C<MemBlockPtrT, ThreadListT>::malloc(unsigned long) {
+           MemBlockPtrT mem;
+           mem.alloc(0);
+       }
+    C<D<16>, int> *_GmemP;
+}
+void *operator new(std::size_t, std::nothrow_t &) noexcept {
+    return vespamalloc::_GmemP->malloc(0);
+}
+void *operator new[](std::size_t, std::nothrow_t &) noexcept {
+    return vespamalloc::_GmemP->malloc(0);
+}
index a18caa1bf3c010bbd8585ac657f632feefbd2941..398ddc1e0413899af8d9b0d2ece0f48831e20d28 100644 (file)
@@ -2107,6 +2107,7 @@ fold_builtin_alloca_with_align (gimple stmt)
      as a declared array, so we allow a larger size.  */
   block = gimple_block (stmt);
   if (!(cfun->after_inlining
+       && block
         && TREE_CODE (BLOCK_SUPERCONTEXT (block)) == FUNCTION_DECL))
     threshold /= 10;
   if (size > threshold)