https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78909

            Bug ID: 78909
           Summary: local variables unavailable in constructor under
                    Oracle dbx
           Product: gcc
           Version: 6.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: debug
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ivan.soleimanipour at oracle dot com
  Target Milestone: ---

Consider this code:
---------------------------------------------
#include <stdio.h>

class Widget {
public:
    Widget(int i) {
            int x = i;
            while (!x);
        }
    void method(int j) {
            int y = j;
            while (!y);
    }
    int id;
};

class AnotherClass {
};


class MyClass : public AnotherClass {
public:
    static void callback(Widget *b, MyClass *ptr) {
        ptr->callback(b);
    }

    void callback(Widget *b) {
        printf("callback\n");
    }
};

int
main()
{
    Widget *b = new Widget(4);
    b->method(5);
    MyClass mc;
    MyClass::callback(b, &mc);
}
----------------------------------------------
Using Oracle Solaris/Developer Studio dbx if you stop in Widget() you cannot
see
'x' but if you stop in method() you can see 'y'.

There are two contributing causes:
1) See bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55541
   While it has been fixed in the 5.x series it seems that constructors 
   still suffer from it. I.e. if you look at the dwarfdump for the above
   program Widget() still has a TAG_lexical_block enclosing 'x'.
2) ... and that TAG_lexical_block is missing the attributes AT_low_pc and
   AT_high_pc. Nor is there an AT_ranges. Because no extent can be
   established for the lexical block dbx won't create a Scope in it's symbol
   table and there's nowhere to hang 'x' off of so it gets ignored.

Reply via email to