aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJeffrey Yasskin <jyasskin@google.com>2011-07-27 18:38:48 +0000
committerJeffrey Yasskin <jyasskin@gcc.gnu.org>2011-07-27 18:38:48 +0000
commitce77c22f1bf5674d60710fba3cf8c43d502db01b (patch)
tree0046d7d004c0b89fc7974e8ca5f38cc5ebe79a08 /gcc
parentf22cfb2e4ef3c8749a4814ebd5d0b39173b05b18 (diff)
downloadgcc-ce77c22f1bf5674d60710fba3cf8c43d502db01b.zip
gcc-ce77c22f1bf5674d60710fba3cf8c43d502db01b.tar.gz
gcc-ce77c22f1bf5674d60710fba3cf8c43d502db01b.tar.bz2
Propagate the source location of a template's function_decl to the template_decl built out of it.
Propagate the source location of a template's function_decl to the template_decl built out of it. Without this, specializations generated before the template was defined get the location of the closing ')' instead of the location of the template's name, which can produce inconsistent locations between translation units, which makes gold's ODR checker unhappy. * gcc/cp/pt.c (build_template_decl): Copy the function_decl's source location to the new template_decl. * gcc/testsuite/g++.old-deja/g++.pt/crash60.C: Updated. * libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Updated. From-SVN: r176845
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c1
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/crash60.C4
4 files changed, 12 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d169ed1..653a0ab 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2011-07-27 Jeffrey Yasskin <jyasskin@google.com>
+
+ * pt.c (build_template_decl): Copy the function_decl's
+ source location to the new template_decl.
+
2011-07-26 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/49776
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 178685c..b9e09af 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -4121,6 +4121,7 @@ build_template_decl (tree decl, tree parms, bool member_template_p)
tree tmpl = build_lang_decl (TEMPLATE_DECL, DECL_NAME (decl), NULL_TREE);
DECL_TEMPLATE_PARMS (tmpl) = parms;
DECL_CONTEXT (tmpl) = DECL_CONTEXT (decl);
+ DECL_SOURCE_LOCATION (tmpl) = DECL_SOURCE_LOCATION (decl);
DECL_MEMBER_TEMPLATE_P (tmpl) = member_template_p;
return tmpl;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a5fd846..952c3ca 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2011-07-27 Jeffrey Yasskin <jyasskin@google.com>
+
+ * g++.old-deja/g++.pt/crash60.C: Updated.
+
2011-07-27 Jakub Jelinek <jakub@redhat.com>
PR target/49866
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash60.C b/gcc/testsuite/g++.old-deja/g++.pt/crash60.C
index 747af9b..1be4678 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/crash60.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/crash60.C
@@ -5,9 +5,9 @@
// We ICE'd rather than fail to instantiate.
template< typename SID, class SDR >
-void k( SID sid, SDR* p,
+void k( SID sid, SDR* p, // { dg-error "no type named 'T'" }
void (SDR::*)
- ( typename SID::T ) ); // { dg-error "no type named 'T'" }
+ ( typename SID::T ) );
struct E { };
struct S { void f( int ); };