From: Jason Merrill Date: Wed, 20 Apr 2011 00:06:19 +0000 (-0400) Subject: re PR c++/45267 (inlining fails with -m32) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c45413fef61b8c6873f01e1e2f57cd0be6fcec46;p=gcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ec683a2fc14..7feb4279565 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-04-19 Jason Merrill + + PR c++/45267 + * decl.c (duplicate_decls): Keep always_inline attribute + in sync with DECL_DISREGARD_INLINE_LIMITS. + 2011-04-18 Jason Merrill PR c++/48569 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 794832b2e0a..63096485ffe 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b6de528e4ae..7e5d187a192 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-04-19 Jason Merrill + + * g++.dg/ext/attrib41.C: New. + 2011-04-19 Kaz Kojima PR testsuite/48676 diff --git a/gcc/testsuite/g++.dg/ext/attrib41.C b/gcc/testsuite/g++.dg/ext/attrib41.C new file mode 100644 index 00000000000..368554a1b1d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib41.C @@ -0,0 +1,19 @@ +// PR c++/45267 +// { dg-options "-O" } + +template struct Vector { + Vector(long long x); + inline Vector operator<<(int x) const __attribute__((always_inline)); +}; +long long bar (long long); +template<> inline Vector Vector::operator<<(int x) const { + return bar(x); +} +bool b; +int main() { + Vector a(1); + if ((a << 2), b) { + a << 2; + throw 1; + } +}