re PR c++/45267 (inlining fails with -m32)

PR c++/45267
	* decl.c (duplicate_decls): Keep always_inline attribute
	in sync with DECL_DISREGARD_INLINE_LIMITS.

From-SVN: r172744
This commit is contained in:
Jason Merrill 2011-04-19 20:06:19 -04:00 committed by Jason Merrill
parent 8f88846854
commit c45413fef6
4 changed files with 42 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2011-04-19 Jason Merrill <jason@redhat.com>
PR c++/45267
* decl.c (duplicate_decls): Keep always_inline attribute
in sync with DECL_DISREGARD_INLINE_LIMITS.
2011-04-18 Jason Merrill <jason@redhat.com>
PR c++/48569

View file

@ -2052,6 +2052,19 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
/* [temp.expl.spec/14] We don't inline explicit specialization
just because the primary template says so. */
/* But still keep DECL_DISREGARD_INLINE_LIMITS in sync with
the always_inline attribute. */
if (DECL_DISREGARD_INLINE_LIMITS (olddecl)
&& !DECL_DISREGARD_INLINE_LIMITS (newdecl))
{
if (DECL_DECLARED_INLINE_P (newdecl))
DECL_DISREGARD_INLINE_LIMITS (newdecl) = true;
else
DECL_ATTRIBUTES (newdecl)
= remove_attribute ("always_inline",
DECL_ATTRIBUTES (newdecl));
}
}
else if (new_defines_function && DECL_INITIAL (olddecl))
{

View file

@ -1,3 +1,7 @@
2011-04-19 Jason Merrill <jason@redhat.com>
* g++.dg/ext/attrib41.C: New.
2011-04-19 Kaz Kojima <kkojima@gcc.gnu.org>
PR testsuite/48676

View file

@ -0,0 +1,19 @@
// PR c++/45267
// { dg-options "-O" }
template<typename T> struct Vector {
Vector(long long x);
inline Vector<T> operator<<(int x) const __attribute__((always_inline));
};
long long bar (long long);
template<> inline Vector<int> Vector<int>::operator<<(int x) const {
return bar(x);
}
bool b;
int main() {
Vector<int> a(1);
if ((a << 2), b) {
a << 2;
throw 1;
}
}