OSDN Git Service

PR c++/42010
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 5 Dec 2009 01:51:46 +0000 (01:51 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 5 Dec 2009 01:51:46 +0000 (01:51 +0000)
* cp-tree.h (DECL_DISCRIMINATOR_SET_P): New.
* mangle.c (discriminator_for_local_entity): Check it.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155007 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/mangle.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/abi/local2.C [new file with mode: 0644]

index 7ec27d4..bb3f8f9 100644 (file)
@@ -1,5 +1,9 @@
 2009-12-04  Jason Merrill  <jason@redhat.com>
 
 2009-12-04  Jason Merrill  <jason@redhat.com>
 
+       PR c++/42010
+       * cp-tree.h (DECL_DISCRIMINATOR_SET_P): New.
+       * mangle.c (discriminator_for_local_entity): Check it.
+
        PR c++/42277
        * semantics.c (finish_decltype_type): Defer handling of decltype
        of a non-dependent COMPONENT_REF in a template.
        PR c++/42277
        * semantics.c (finish_decltype_type): Defer handling of decltype
        of a non-dependent COMPONENT_REF in a template.
index dc563e2..21a914d 100644 (file)
@@ -2052,6 +2052,10 @@ struct GTY(()) lang_decl {
 /* Discriminator for name mangling.  */
 #define DECL_DISCRIMINATOR(NODE) (LANG_DECL_U2_CHECK (NODE, 1)->discriminator)
 
 /* Discriminator for name mangling.  */
 #define DECL_DISCRIMINATOR(NODE) (LANG_DECL_U2_CHECK (NODE, 1)->discriminator)
 
+/* True iff DECL_DISCRIMINATOR is set for a DECL_DISCRIMINATOR_P decl.  */
+#define DECL_DISCRIMINATOR_SET_P(NODE) \
+  (DECL_LANG_SPECIFIC (NODE) && DECL_LANG_SPECIFIC (NODE)->u.base.u2sel == 1)
+
 /* The index of a user-declared parameter in its function, starting at 1.
    All artificial parameters will have index 0.  */
 #define DECL_PARM_INDEX(NODE) \
 /* The index of a user-declared parameter in its function, starting at 1.
    All artificial parameters will have index 0.  */
 #define DECL_PARM_INDEX(NODE) \
index cd2b7d7..3afc094 100644 (file)
@@ -1577,11 +1577,11 @@ discriminator_for_local_entity (tree entity)
 {
   if (DECL_DISCRIMINATOR_P (entity))
     {
 {
   if (DECL_DISCRIMINATOR_P (entity))
     {
-      if (DECL_LANG_SPECIFIC (entity))
+      if (DECL_DISCRIMINATOR_SET_P (entity))
        return DECL_DISCRIMINATOR (entity);
       else
        /* The first entity with a particular name doesn't get
        return DECL_DISCRIMINATOR (entity);
       else
        /* The first entity with a particular name doesn't get
-          DECL_LANG_SPECIFIC/DECL_DISCRIMINATOR.  */
+          DECL_DISCRIMINATOR set up.  */
        return 0;
     }
   else if (TREE_CODE (entity) == TYPE_DECL)
        return 0;
     }
   else if (TREE_CODE (entity) == TYPE_DECL)
index ed866cf..12a57bc 100644 (file)
@@ -1,5 +1,8 @@
 2009-12-04  Jason Merrill  <jason@redhat.com>
 
 2009-12-04  Jason Merrill  <jason@redhat.com>
 
+       PR c++/42010
+       * g++.dg/abi/local2.C: New.
+
        PR c++/42277
        * g++.dg/cpp0x/decltype20.C: New.
 
        PR c++/42277
        * g++.dg/cpp0x/decltype20.C: New.
 
diff --git a/gcc/testsuite/g++.dg/abi/local2.C b/gcc/testsuite/g++.dg/abi/local2.C
new file mode 100644 (file)
index 0000000..f567016
--- /dev/null
@@ -0,0 +1,17 @@
+// PR c++/42010
+// { dg-final { scan-assembler "ZZN1A1fEvE1s" } }
+
+struct A {
+  static int f()
+  {
+    static struct {
+      int i;
+    } s;
+    return s.i;
+  }
+};
+
+int main()
+{
+  return A::f();
+}