diff --git a/src/geo/discreteVertex.cpp b/src/geo/discreteVertex.cpp
index 7811cb7ddf6aab0f8d74ba7d03c6d927753281cc..49f93bcb8cece170863e2e4e8ed08572840843ec 100644
--- a/src/geo/discreteVertex.cpp
+++ b/src/geo/discreteVertex.cpp
@@ -18,7 +18,7 @@ discreteVertex::discreteVertex(GModel *m, int num, double x, double y, double z)
   Tree_Add(m->getGEOInternals()->Points, &_v);
 }
 
-discreteVertex::discreteVertex(GModel *m) : GVertex(m, 0)
+discreteVertex::discreteVertex(GModel *m) : GVertex(m, 0), _v(nullptr)
 {
   // used for temporary discrete vertices, that should not lead to the creation
   // of the corresponding entity in GEO internals
@@ -30,9 +30,11 @@ GPoint discreteVertex::point() const { return GPoint(x(), y(), z(), this); }
 
 void discreteVertex::setPosition(GPoint &p)
 {
-  _v->Pos.X = p.x();
-  _v->Pos.Y = p.y();
-  _v->Pos.Z = p.z();
+  if(_v) {
+    _v->Pos.X = p.x();
+    _v->Pos.Y = p.y();
+    _v->Pos.Z = p.z();
+  }
   if(mesh_vertices.size()) {
     mesh_vertices[0]->x() = p.x();
     mesh_vertices[0]->y() = p.y();
@@ -42,15 +44,24 @@ void discreteVertex::setPosition(GPoint &p)
 
 double discreteVertex::x() const
 {
-  return mesh_vertices.size() ? mesh_vertices[0]->x() : _v->Pos.X;
+  if(mesh_vertices.size()) return mesh_vertices[0]->x();
+  if(_v) return _v->Pos.X;
+  Msg::Warning("No coordinate in discrete point %d", tag());
+  return 0.;
 }
 
 double discreteVertex::y() const
 {
-  return mesh_vertices.size() ? mesh_vertices[0]->y() : _v->Pos.Y;
+  if(mesh_vertices.size()) return mesh_vertices[0]->y();
+  if(_v) return _v->Pos.Y;
+  Msg::Warning("No coordinate in discrete point %d", tag());
+  return 0.;
 }
 
 double discreteVertex::z() const
 {
-  return mesh_vertices.size() ? mesh_vertices[0]->z() : _v->Pos.Z;
+  if(mesh_vertices.size()) return mesh_vertices[0]->z();
+  if(_v) return _v->Pos.Z;
+  Msg::Warning("No coordinate in discrete point %d", tag());
+  return 0.;
 }