http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50672

Markus Trippelsdorf <markus at trippelsdorf dot de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |markus at trippelsdorf dot
                   |                            |de

--- Comment #4 from Markus Trippelsdorf <markus at trippelsdorf dot de> 
2011-10-09 15:28:16 UTC ---
 % cat test.ii 
namespace std {
  template<class _CharT>     struct char_traits;
  typedef struct __locale_struct {
  }
  *__locale_t;
  template<typename _CharT, typename _Traits = char_traits<_CharT> >     class
basic_ostream;
  typedef basic_ostream<char> ostream;
  }
   class UniqueId {
  };
   typedef int BoxCoordinate;
   typedef int BoxDimension;
   const BoxDimension X = 0;
   const BoxDimension Y = 1;
   const BoxDimension NDimensions = 2;
   class BoxPoint {
  protected:      BoxCoordinate point[NDimensions];
  public:      BoxPoint(BoxCoordinate x, BoxCoordinate y)     {
       }
       bool isValid() const     {
       }
       void operator += (const BoxPoint& p)     {
            if (isValid() && p.isValid())  {
                 point[X] += p.point[X];
            }
       }
       BoxCoordinate& operator [] (const BoxDimension& dimension)     {
            return point[dimension];
       }
  };
   class BoxSize: public BoxPoint {
  };
   class BoxRegion {
  private:      BoxPoint _origin;
       BoxSize _space;
  public:      BoxRegion(const BoxPoint& o, const BoxSize& s)  : _origin(o),
_space(s)     {
       }
       BoxCoordinate& origin(BoxDimension d) {
       }
       BoxCoordinate& space(BoxDimension d) {
       }
  };
   inline bool operator <= (const BoxPoint& p, const BoxRegion& r) {
       for (BoxDimension d = X;
                 d <= Y;
                 d++)  if (p[d] < r.origin(d) || p[d] >= r.origin(d) +
r.space(d))      return false;
       return true;
  }
   extern "C" {
       typedef struct _WidgetRec *Widget;
  }
   struct GraphGC {
       BoxPoint offsetIfSelected;
  };
   class GraphNode;
   class Graph;
   class GraphEdge {
  private:      UniqueId _id;
       GraphNode *_from;
       GraphNode *_to;
       bool _hidden;
       GraphEdge *_nextFrom;
       GraphEdge *_nextTo;
       GraphEdge *_prevFrom;
       GraphEdge *_prevTo;
       GraphEdge *next;
       GraphEdge *prev;
       Graph *graph;
  public:      GraphEdge(GraphNode *f, GraphNode *t):  _id(),         _from(f),
_to(t),         _hidden(false),         _nextFrom(0), _nextTo(0),    
     _prevFrom(0), _prevTo(0),         next(0), prev(0), graph(0)     {
       }
       GraphNode *from() const {
       }
       GraphNode *to() const {
       }
  };
   class LineGraphEdge: public GraphEdge {
  protected:      static void findLine(const BoxPoint& c1, const BoxPoint& c2, 
   const BoxRegion& b1, const BoxRegion& b2,     BoxPoint& p1, BoxPoi
nt& p2,     const GraphGC& gc);
       virtual void drawLine(Widget w,      const BoxRegion& exposed,     
const GraphGC& gc) const;
  public:      void _print(std::ostream& os, const GraphGC &gc) const;
  };
   class ArcGraphEdge: public LineGraphEdge {
       static bool center(const BoxPoint& p1, const BoxPoint& p2,         
const BoxPoint& p3, double& x, double& y);
       void makeLine(Widget w,     const BoxRegion& exposed,     std::ostream&
os,     const GraphGC& gc) const;
  };
   class GraphNode {
  public:      int count;
       bool& selected() {
       }
       GraphEdge *firstTo() const {
       }
       GraphEdge *nextTo(GraphEdge *ref) const;
       virtual const BoxPoint& pos() const = 0;
       virtual const BoxRegion& region(const GraphGC& gc) const = 0;
       virtual bool isHint() const {
       }
  };
   class PosGraphNode: public GraphNode {
  };
   class RegionGraphNode: public PosGraphNode {
  };
   class HintGraphNode: public RegionGraphNode {
  };
   void ArcGraphEdge::makeLine(Widget w,        const BoxRegion& exposed,      
 std::ostream& os,        const GraphGC& gc) const {
       HintGraphNode *arc_hint = 0;
       RegionGraphNode *arc_from = 0;
       RegionGraphNode *arc_to = 0;
       bool make_arc = true;
       if (from()->isHint() && to()->isHint())     {
            make_arc = false;
       }
  else if (from()->isHint() && from()->firstTo() != 0)     {
            if (arc_hint == 0 || arc_from == 0 || arc_to == 0      ||
arc_hint->nextTo(arc_hint->firstTo()) != 0)  {
                 make_arc = false;
            }
       }
       if (!make_arc)     {
            if (w != 0)      LineGraphEdge::drawLine(w, exposed, gc);
            else      LineGraphEdge::_print(os, gc);
            return;
       }
       BoxPoint pos_from = arc_from->pos();
       BoxRegion region_from = arc_from->region(gc);
       BoxPoint pos_to = arc_to->pos();
       BoxRegion region_to = arc_to->region(gc);
       BoxPoint pos_hint = arc_hint->pos();
       if (arc_hint->selected())     {
            pos_hint += gc.offsetIfSelected;
       }
       if (pos_hint <= region_from || pos_hint <= region_to)     {
            return;
       }
       double cx, cy;
       bool ok = center(pos_from, pos_hint, pos_to, cx, cy);
       if (!ok)     {
            if (w != 0)      LineGraphEdge::drawLine(w, exposed, gc);
            else      LineGraphEdge::_print(os, gc);
       }
  }

 % g++ test.ii -Wfatal-errors -S -O2 -w -fpermissive -o /dev/null
test.ii: In member function ‘void ArcGraphEdge::makeLine(Widget, const
BoxRegion&, std::ostream&, const GraphGC&) const’:
test.ii:103:9: internal compiler error: Segmentation fault

Reply via email to