Index: /trunk/test/data/regress/14788/remove_sign_test_4.osm
===================================================================
--- /trunk/test/data/regress/14788/remove_sign_test_4.osm	(revision 12137)
+++ /trunk/test/data/regress/14788/remove_sign_test_4.osm	(revision 12137)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<osm version="0.6" upload='never'>
+    <bounds minlat="45.4333839417" minlon="12.3324651718" maxlat="45.4374351501" maxlon="12.3392772675"/>
+    <node id="978" visible="true" version="10" changeset="12345678" timestamp="2017-05-13T05:47:18Z" user="Tharindu" uid="123456" lat="nan" lon="nan">
+        <tag k="sign" v="yes"/>
+        <tag k="appeal" v="0.620945"/>
+        <tag k="name" v="Piazza San Marco"/>
+        <tag k="tourism" v="information"/>
+        <tag k="information" v="guidepost"/>
+    </node>
+</osm>
Index: /trunk/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java	(revision 12136)
+++ /trunk/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java	(revision 12137)
@@ -48,3 +48,19 @@
         }
     }
+
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/14788">Bug #14788</a>.
+     * @throws Exception if any error occurs
+     */
+    @Test
+    public void testTicket14788() throws Exception {
+        try (InputStream in = TestUtils.getRegressionDataStream(14788, "remove_sign_test_4.osm")) {
+            OsmReader.parseDataSet(in, NullProgressMonitor.INSTANCE);
+            fail("should throw exception");
+        } catch (IllegalDataException e) {
+            assertEquals("Illegal value for attributes 'lat', 'lon' on node with ID 978." +
+                    " Got 'nan', 'nan'." +
+                    " (at line 4, column 151). 336 bytes have been read", e.getMessage());
+        }
+    }
 }
