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:
parent
8f88846854
commit
c45413fef6
4 changed files with 42 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
19
gcc/testsuite/g++.dg/ext/attrib41.C
Normal file
19
gcc/testsuite/g++.dg/ext/attrib41.C
Normal 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;
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue