From 7a3a9e6821ff5ed3e6f41e58d1d47bbbbd4e3e2b Mon Sep 17 00:00:00 2001
From: Jason Merrill <jason@redhat.com>
Date: Mon, 12 Nov 2012 12:51:26 -0500
Subject: [PATCH] * include/std/complex (real, imag): Add ABI tag in C++11
 mode.

From-SVN: r193445
---
 libstdc++-v3/ChangeLog                        |  4 +++
 libstdc++-v3/include/std/complex              |  8 ++++++
 .../testsuite/26_numerics/complex/abi_tag.cc  | 25 +++++++++++++++++++
 3 files changed, 37 insertions(+)
 create mode 100644 libstdc++-v3/testsuite/26_numerics/complex/abi_tag.cc

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 7276018f4ef6..391e5d9010cd 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,7 @@
+2012-11-11  Jason Merrill  <jason@redhat.com>
+
+	* include/std/complex (real, imag): Add ABI tag in C++11 mode.
+
 2012-11-11  Andreas Schwab  <schwab@linux-m68k.org>
 
 	* doc/xml/chapter.txml: Remove whitespace inside <keyword>.
diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex
index f9221a86e0bb..b13b11becc5c 100644
--- a/libstdc++-v3/include/std/complex
+++ b/libstdc++-v3/include/std/complex
@@ -141,9 +141,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #if __cplusplus >= 201103L
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // DR 387. std::complex over-encapsulated.
+      __attribute ((__abi_tag__ ("cxx11")))
       constexpr _Tp 
       real() { return _M_real; }
 
+      __attribute ((__abi_tag__ ("cxx11")))
       constexpr _Tp 
       imag() { return _M_imag; }
 #else
@@ -1061,9 +1063,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #if __cplusplus >= 201103L
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // DR 387. std::complex over-encapsulated.
+      __attribute ((__abi_tag__ ("cxx11")))
       constexpr float 
       real() { return __real__ _M_value; }
 
+      __attribute ((__abi_tag__ ("cxx11")))
       constexpr float 
       imag() { return __imag__ _M_value; }
 #else
@@ -1210,9 +1214,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #if __cplusplus >= 201103L
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // DR 387. std::complex over-encapsulated.
+      __attribute ((__abi_tag__ ("cxx11")))
       constexpr double 
       real() { return __real__ _M_value; }
 
+      __attribute ((__abi_tag__ ("cxx11")))
       constexpr double 
       imag() { return __imag__ _M_value; }
 #else
@@ -1360,9 +1366,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #if __cplusplus >= 201103L
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // DR 387. std::complex over-encapsulated.
+      __attribute ((__abi_tag__ ("cxx11")))
       constexpr long double 
       real() { return __real__ _M_value; }
 
+      __attribute ((__abi_tag__ ("cxx11")))
       constexpr long double 
       imag() { return __imag__ _M_value; }
 #else
diff --git a/libstdc++-v3/testsuite/26_numerics/complex/abi_tag.cc b/libstdc++-v3/testsuite/26_numerics/complex/abi_tag.cc
new file mode 100644
index 000000000000..a84546672288
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/complex/abi_tag.cc
@@ -0,0 +1,25 @@
+// Test that the C++11 variants of real/imag have an ABI tag
+// { dg-do compile }
+// { dg-options -std=c++11 }
+
+#include <complex>
+
+// { dg-final { scan-assembler "_ZNKSt7complexIfE4realB5cxx11Ev" } }
+float (std::complex<float>::*p1)() const = &std::complex<float>::real;
+// { dg-final { scan-assembler "_ZNKSt7complexIdE4realB5cxx11Ev" } }
+double (std::complex<double>::*p2)() const = &std::complex<double>::real;
+// { dg-final { scan-assembler "_ZNKSt7complexIeE4realB5cxx11Ev" } }
+long double (std::complex<long double>::*p3)() const
+  = &std::complex<long double>::real;
+// { dg-final { scan-assembler "_ZNKSt7complexIiE4realB5cxx11Ev" } }
+int (std::complex<int>::*p4)() const = &std::complex<int>::real;
+
+// { dg-final { scan-assembler "_ZNKSt7complexIfE4imagB5cxx11Ev" } }
+float (std::complex<float>::*p5)() const = &std::complex<float>::imag;
+// { dg-final { scan-assembler "_ZNKSt7complexIdE4imagB5cxx11Ev" } }
+double (std::complex<double>::*p6)() const = &std::complex<double>::imag;
+// { dg-final { scan-assembler "_ZNKSt7complexIeE4imagB5cxx11Ev" } }
+long double (std::complex<long double>::*p7)() const
+  = &std::complex<long double>::imag;
+// { dg-final { scan-assembler "_ZNKSt7complexIiE4imagB5cxx11Ev" } }
+int (std::complex<int>::*p8)() const = &std::complex<int>::imag;
-- 
GitLab