Commit 790ecf85 by Jakub Jelinek Committed by Jason Merrill

PR c++/79502 - lost nodiscard attribute

	* pt.c (apply_late_template_attributes): Do apply non-dependent
	attributes to types.

Co-Authored-By: Jason Merrill <jason@redhat.com>

From-SVN: r245516
parent dbd0ef6d
2017-02-16 Jakub Jelinek <jakub@redhat.com>
Jason Merrill <jason@redhat.com>
PR c++/79502 - lost nodiscard attribute
* pt.c (apply_late_template_attributes): Do apply non-dependent
attributes to types.
2017-02-16 Jason Merrill <jason@redhat.com> 2017-02-16 Jason Merrill <jason@redhat.com>
PR c++/78572 - ICE with self-modifying array initializer PR c++/78572 - ICE with self-modifying array initializer
......
...@@ -10073,29 +10073,43 @@ apply_late_template_attributes (tree *decl_p, tree attributes, int attr_flags, ...@@ -10073,29 +10073,43 @@ apply_late_template_attributes (tree *decl_p, tree attributes, int attr_flags,
tree t; tree t;
tree *p; tree *p;
for (t = attributes; t; t = TREE_CHAIN (t)) if (attributes == NULL_TREE)
if (ATTR_IS_DEPENDENT (t)) return;
{
last_dep = t;
attributes = copy_list (attributes);
break;
}
if (DECL_P (*decl_p)) if (DECL_P (*decl_p))
{ {
if (TREE_TYPE (*decl_p) == error_mark_node) if (TREE_TYPE (*decl_p) == error_mark_node)
return; return;
p = &DECL_ATTRIBUTES (*decl_p); p = &DECL_ATTRIBUTES (*decl_p);
/* DECL_ATTRIBUTES comes from copy_node in tsubst_decl, and is identical
to our attributes parameter. */
gcc_assert (*p == attributes);
} }
else else
p = &TYPE_ATTRIBUTES (*decl_p); {
p = &TYPE_ATTRIBUTES (*decl_p);
/* TYPE_ATTRIBUTES was set up (with abi_tag and may_alias) in
lookup_template_class_1, and should be preserved. */
gcc_assert (*p != attributes);
while (*p)
p = &TREE_CHAIN (*p);
}
for (t = attributes; t; t = TREE_CHAIN (t))
if (ATTR_IS_DEPENDENT (t))
{
last_dep = t;
attributes = copy_list (attributes);
break;
}
*p = attributes;
if (last_dep) if (last_dep)
{ {
tree late_attrs = NULL_TREE; tree late_attrs = NULL_TREE;
tree *q = &late_attrs; tree *q = &late_attrs;
for (*p = attributes; *p; ) for (; *p; )
{ {
t = *p; t = *p;
if (ATTR_IS_DEPENDENT (t)) if (ATTR_IS_DEPENDENT (t))
......
// { dg-do compile { target c++11 } }
inline namespace N __attribute__((__abi_tag__ ("foo"))) {}
template <typename> struct A {};
namespace N {
template <typename> class B {};
}
template <typename T> class __attribute__((__aligned__ (sizeof (T)))) C {};
template <typename> struct D {
template <typename _Up> using G = C<_Up>;
};
template <typename T> struct F {
template <typename U> struct H {
typedef typename D<T>::template G<U> I;
};
};
template <typename T, typename = C<T>> struct J {
C<A<const B<char>>> L;
typedef F<C<int>>::H<A<const B<char>>>::I M;
J<M> *a;
};
// { dg-do compile { target c++11 } }
inline namespace N __attribute__((__abi_tag__ ("foo"))) {}
template <typename> struct A {};
namespace N {
template <typename> class B {};
}
template <typename T> class __attribute__((__unused__)) C {};
template <typename> struct D {
template <typename _Up> using G = C<_Up>;
};
template <typename T> struct F {
template <typename U> struct H {
typedef typename D<T>::template G<U> I;
};
};
template <typename T, typename = C<T>> struct J {
C<A<const B<char>>> L;
typedef F<C<int>>::H<A<const B<char>>>::I M;
J<M> *a;
};
// PR c++/79502
// { dg-do compile { target c++11 } }
template<typename>
struct [[nodiscard]] missiles {};
missiles<void> make() { return {}; }
missiles<void> (*fnptr)() = make;
int main()
{
make(); // { dg-warning "ignoring returned value of type" }
fnptr(); // { dg-warning "ignoring returned value of type" }
}
// { dg-do compile { target c++11 } }
inline namespace N __attribute__((__abi_tag__ ("foo"))) {}
template <typename> struct A;
namespace N {
template <typename> class B;
}
template <typename> class C {};
template <typename> struct D {
template <typename _Up> using G = C<_Up>;
};
template <typename T> struct F {
template <typename U> struct H {
typedef typename D<T>::template G<U> I;
};
};
template <typename T, typename = C<T>> struct J {
C<A<const B<char>>> L;
typedef F<C<int>>::H<A<const B<char>>>::I M;
J<M> *a;
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment