re PR c++/55275 (abi_tag attribute doesn't work on explicit specializations of class...
authorJason Merrill <jason@redhat.com>
Thu, 15 Nov 2012 01:53:23 +0000 (20:53 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 15 Nov 2012 01:53:23 +0000 (20:53 -0500)
PR c++/55275
* pt.c (maybe_process_partial_specialization): Update
DECL_SOURCE_LOCATION for new specializations.

From-SVN: r193524

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/abi/abi-tag3.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/pr31439.C
gcc/testsuite/g++.dg/template/crash98.C
libstdc++-v3/testsuite/ext/type_traits/add_unsigned_integer_neg.cc
libstdc++-v3/testsuite/ext/type_traits/remove_unsigned_integer_neg.cc

index d382a04f895ecda8a73cc46299a5a8e30fcde949..bb5e4bad4a7d6702c3284acf1cd7475fb7031e33 100644 (file)
@@ -1,3 +1,9 @@
+2012-11-13  Jason Merrill  <jason@redhat.com>
+
+       PR c++/55275
+       * pt.c (maybe_process_partial_specialization): Update
+       DECL_SOURCE_LOCATION for new specializations.
+
 2012-11-14  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/55323
index 802c79b875579ef9f7c5d80732bc27a7eed2aac3..3c9bb56c66baa7f75ca61f7de794abbce1b1178e 100644 (file)
@@ -838,6 +838,7 @@ maybe_process_partial_specialization (tree type)
        {
          check_specialization_namespace (CLASSTYPE_TI_TEMPLATE (type));
          SET_CLASSTYPE_TEMPLATE_SPECIALIZATION (type);
+         DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)) = input_location;
          if (processing_template_decl)
            {
              if (push_template_decl (TYPE_MAIN_DECL (type))
@@ -934,6 +935,7 @@ maybe_process_partial_specialization (tree type)
             have one level of template argument for the innermost
             class template.  */
          SET_CLASSTYPE_TEMPLATE_SPECIALIZATION (type);
+         DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)) = input_location;
          CLASSTYPE_TI_ARGS (type)
            = INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (type));
        }
diff --git a/gcc/testsuite/g++.dg/abi/abi-tag3.C b/gcc/testsuite/g++.dg/abi/abi-tag3.C
new file mode 100644 (file)
index 0000000..05fd58e
--- /dev/null
@@ -0,0 +1,36 @@
+// An explicit specialization doesn't get the tag from its template unless
+// it is specified there, too.
+
+// { dg-final { scan-assembler "_ZN3FooB5cxx11IcE1fEv" } }
+template<typename T>
+struct __attribute ((abi_tag("cxx11"))) Foo
+{
+  int f();
+};
+
+// { dg-final { scan-assembler "_ZN3FooB5cxx11IiE1fEv" } }
+template<>
+struct
+__attribute ((abi_tag("cxx11")))
+Foo<int>
+{
+  int f();
+};
+
+// { dg-final { scan-assembler "_ZN3FooIdE1fEv" } }
+template<>
+struct
+Foo<double>
+{
+  int f();
+};
+
+int main()
+{
+  Foo<int> f;
+  f.f();
+  Foo<char> f1;
+  f1.f();
+  Foo<double> f2;
+  f2.f();
+}
index 9d22b56c2f8bc95b8bfc038d09dbf5dcd635efaa..c64bc3145b6d6f79f09b6aa05e1d6a0ccc33e600 100644 (file)
@@ -1,7 +1,7 @@
 // { dg-options "-std=c++0x" }
-template<typename...> struct A; // { dg-error "declaration" }
+template<typename...> struct A;
 
-template<char> struct A<> {}; // { dg-error "not used in partial specialization|anonymous" }
+template<char> struct A<> {}; // { dg-error "not used in partial specialization|anonymous|declaration" }
 
 template<typename T, typename... U> struct A<T, U...> : A<U...> {}; // { dg-error "incomplete type" }
 
index e3c224df1d9c7ad8eb944382adfc40777ce021f2..a79ab02f695f453ea01255cf54dba52fb438d6fc 100644 (file)
@@ -1,8 +1,8 @@
 // PR c++/43630
 
-template < typename > struct A; // { dg-error "declaration" }
+template < typename > struct A;
 
-template < typename > struct A < int > // { dg-error "not used|template\\-parameter" }
+template < typename > struct A < int > // { dg-error "not used|template\\-parameter|declaration" }
 {
   int i;
   int f ();
index b976de022b4f0b8fa91826b6da165421700edc69..bdd27cc85e1983f7a24be56773a61b5aee9e4b5c 100644 (file)
@@ -36,4 +36,5 @@ int main()
 }
 
 // { dg-error "invalid use of incomplete" "" { target *-*-* } 28 } 
-// { dg-error "declaration of" "" { target *-*-* } 63 }
+// { dg-error "declaration of" "" { target *-*-* } 98 }
+// { dg-error "declaration of" "" { target *-*-* } 101 }
index bd5c4237e027e6dedbd32a1384bd4c9b525867c7..099178ef1ce78e02562252f468a46b0f18081c90 100644 (file)
@@ -36,4 +36,5 @@ int main()
 }
 
 // { dg-error "invalid use of incomplete" "" { target *-*-* } 28 } 
-// { dg-error "declaration of" "" { target *-*-* } 106 }
+// { dg-error "declaration of" "" { target *-*-* } 141 }
+// { dg-error "declaration of" "" { target *-*-* } 144 }