PR c++/90953 - ICE with -Wmissing-format-attribute.
authorMarek Polacek <polacek@redhat.com>
Fri, 21 Jun 2019 14:41:22 +0000 (14:41 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 21 Jun 2019 14:41:22 +0000 (14:41 +0000)
* c-common.c (check_function_arguments_recurse): Use
get_attribute_name.
(check_missing_format_attribute): Likewise.

* g++.dg/warn/miss-format-7.C: New test.

From-SVN: r272552

gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/miss-format-7.C [new file with mode: 0644]

index e744561f67a9cd4e6b92157a2603d23fabfe63f9..c1522b249b547829de2ba3e1a932d953e1693eca 100644 (file)
@@ -1,3 +1,10 @@
+2019-06-21  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/90953 - ICE with -Wmissing-format-attribute.
+       * c-common.c (check_function_arguments_recurse): Use
+       get_attribute_name.
+       (check_missing_format_attribute): Likewise.
+
 2019-06-19  Marek Polacek  <polacek@redhat.com>
 
        PR c++/60364 - noreturn after first decl not diagnosed.
index 4057be3aaed2692687744d3058e3a60c27344953..f562704006734a261e5d6137780916ebed06265e 100644 (file)
@@ -5753,7 +5753,7 @@ check_function_arguments_recurse (void (*callback)
       for (attrs = TYPE_ATTRIBUTES (type);
           attrs;
           attrs = TREE_CHAIN (attrs))
-       if (is_attribute_p ("format_arg", TREE_PURPOSE (attrs)))
+       if (is_attribute_p ("format_arg", get_attribute_name (attrs)))
          {
            tree inner_arg;
            tree format_num_expr;
@@ -7601,13 +7601,13 @@ check_missing_format_attribute (tree ltype, tree rtype)
   tree ra;
 
   for (ra = TYPE_ATTRIBUTES (ttr); ra; ra = TREE_CHAIN (ra))
-    if (is_attribute_p ("format", TREE_PURPOSE (ra)))
+    if (is_attribute_p ("format", get_attribute_name (ra)))
       break;
   if (ra)
     {
       tree la;
       for (la = TYPE_ATTRIBUTES (ttl); la; la = TREE_CHAIN (la))
-       if (is_attribute_p ("format", TREE_PURPOSE (la)))
+       if (is_attribute_p ("format", get_attribute_name (la)))
          break;
       return !la;
     }
index 21eef285afcec37218fd07cde1cd09a98129dc72..55ca5abef42e5925b0047fa1985832b36069f7c8 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-21  Marek Polacek  <polacek@redhat.com>
+
+       PR c++/90953 - ICE with -Wmissing-format-attribute.
+       * g++.dg/warn/miss-format-7.C: New test.
+
 2019-06-21  Richard Biener  <rguenther@suse.de>
 
        PR debug/90914
diff --git a/gcc/testsuite/g++.dg/warn/miss-format-7.C b/gcc/testsuite/g++.dg/warn/miss-format-7.C
new file mode 100644 (file)
index 0000000..ac892dc
--- /dev/null
@@ -0,0 +1,29 @@
+// PR c++/90953 - ICE with -Wmissing-format-attribute.
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wmissing-format-attribute" }
+
+namespace std {
+union [[gnu::may_alias]] _Any_data{};
+enum _Manager_operation { __get_type_info };
+template <typename> class A;
+class B {
+  typedef bool (*_Manager_type)(_Any_data, const _Any_data &,
+                                _Manager_operation);
+public:
+  _Any_data _M_functor;
+  _Manager_type _M_manager;
+};
+
+struct type_info { } t;
+
+template <typename _Res, typename... _ArgTypes>
+class A<_Res(_ArgTypes...)> : B {
+  const type_info &target_type() const noexcept;
+};
+template <typename _Res, typename... _ArgTypes>
+const type_info &A<_Res(_ArgTypes...)>::target_type() const noexcept {
+  _Any_data __typeinfo_result;
+  _M_manager(__typeinfo_result, _M_functor, __get_type_info);
+  return t;
+}
+} // namespace std