re PR c++/68653 (ICE: in nonnull_arg_p, at tree.c:13853)
authorMarek Polacek <polacek@redhat.com>
Wed, 2 Dec 2015 19:29:17 +0000 (19:29 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Wed, 2 Dec 2015 19:29:17 +0000 (19:29 +0000)
PR c++/68653
* tree.c (nonnull_arg_p): Allow OFFSET_TYPE.

* g++.dg/warn/nonnull3.C: New test.

From-SVN: r231200

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/nonnull3.C [new file with mode: 0644]
gcc/tree.c

index d335b2ef4754a7086201e2f809aeac665df87772..845d9098a39b9d2b1e42ee835099865758a4b013 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-02  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/68653
+       * tree.c (nonnull_arg_p): Allow OFFSET_TYPE.
+
 2015-12-02  Nathan Sidwell  <nathan@acm.org>
 
        * config/nvptx/nvptx.c (enum nvptx_shuffle_kind): New.  Absorb
index feb0a0ae523bab020a1d038bfafdcb054d70cf9d..e8291a9d426c61f6d3d412925f7ae99dab98198d 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-02  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/68653
+       * g++.dg/warn/nonnull3.C: New test.
+
 2015-12-02  Joseph Myers  <joseph@codesourcery.com>
 
        PR c/68162
diff --git a/gcc/testsuite/g++.dg/warn/nonnull3.C b/gcc/testsuite/g++.dg/warn/nonnull3.C
new file mode 100644 (file)
index 0000000..d82fa31
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/68653
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wall" }
+
+struct B;
+struct A {
+  template <typename T> __attribute__((nonnull)) bool foo (int T::*);
+  void bar (B *);
+};
+
+template <typename T> bool A::foo (int T::*p)
+{
+  return p;
+}
+void A::bar (B *)
+{
+  foo ((int B::*) nullptr);
+}
+// { dg-warning "nonnull argument" "" {target "*-*-*"} 0 }
index 587bd7457df3a7fb3b03dfa378f86f02171aa0ff..bd5cf73b65918d6925b17211a7b40d310bd5a30c 100644 (file)
@@ -13848,7 +13848,9 @@ nonnull_arg_p (const_tree arg)
   tree t, attrs, fntype;
   unsigned HOST_WIDE_INT arg_num;
 
-  gcc_assert (TREE_CODE (arg) == PARM_DECL && POINTER_TYPE_P (TREE_TYPE (arg)));
+  gcc_assert (TREE_CODE (arg) == PARM_DECL
+             && (POINTER_TYPE_P (TREE_TYPE (arg))
+                 || TREE_CODE (TREE_TYPE (arg)) == OFFSET_TYPE));
 
   /* The static chain decl is always non null.  */
   if (arg == cfun->static_chain_decl)