Make forward declarations of external symbols really work.

Until now we had always been treating external variables as "int",
and external functions as int (...);
diff --git a/libacc/acc.cpp b/libacc/acc.cpp
index aaddf44..119d106 100644
--- a/libacc/acc.cpp
+++ b/libacc/acc.cpp
@@ -2610,7 +2610,7 @@
         }
 
         virtual void convertR0(Type* pType){
-            fprintf(stderr, "convertR0(pType)\n");
+            fprintf(stderr, "convertR0(pType tag=%d)\n",  pType->tag);
             mpBase->convertR0(pType);
         }
 
@@ -3672,7 +3672,7 @@
 #if 0
         {
             String buf;
-            decodeToken(buf, tok);
+            decodeToken(buf, tok, true);
             fprintf(stderr, "%s\n", buf.getUnwrapped());
         }
 #endif
@@ -3883,10 +3883,12 @@
                 /* forward reference: try dlsym */
                 if (!n) {
                     n = (intptr_t) dlsym(RTLD_DEFAULT, nameof(t));
-                    if (tok == '(') {
-                        pVI->pType = mkpIntFn;
-                    } else {
-                        pVI->pType = mkpInt;
+                    if (pVI->pType == NULL) {
+                        if (tok == '(') {
+                            pVI->pType = mkpIntFn;
+                        } else {
+                            pVI->pType = mkpInt;
+                        }
                     }
                     pVI->pAddress = (void*) n;
                 }
@@ -4156,7 +4158,7 @@
 
         String temp;
         if (pType->id != 0) {
-            decodeToken(temp, pType->id);
+            decodeToken(temp, pType->id, false);
             buffer.append(temp);
         }
 
@@ -4166,7 +4168,7 @@
     void decodeTypeImpPrefix(String& buffer, Type* pType) {
         TypeTag tag = pType->tag;
 
-        if (tag >= TY_INT && tag <= TY_VOID) {
+        if (tag >= TY_INT && tag <= TY_DOUBLE) {
             switch (tag) {
                 case TY_INT:
                     buffer.appendCStr("int");
@@ -4343,7 +4345,7 @@
                 error("Symbol %s not allowed here", nameof(declName));
             } else if (nameRequired && ! declName) {
                 String temp;
-                decodeToken(temp, tok);
+                decodeToken(temp, tok, true);
                 error("Expected symbol. Got %s", temp.getUnwrapped());
             }
         }
@@ -4395,7 +4397,7 @@
         Type* pType = acceptPrimitiveType(arena);
         if (!pType) {
             String buf;
-            decodeToken(buf, tok);
+            decodeToken(buf, tok, true);
             error("Expected a type, got %s", buf.getUnwrapped());
         }
         return pType;
@@ -4455,7 +4457,7 @@
         return checkSymbol(tok);
     }
 
-    void decodeToken(String& buffer, tokenid_t token) {
+    void decodeToken(String& buffer, tokenid_t token, bool quote) {
         if (token == EOF ) {
             buffer.printf("EOF");
         } else if (token == TOK_NUM) {
@@ -4466,10 +4468,16 @@
             } else {
                 buffer.printf("'%c'", token);
             }
-        } else if (token >= TOK_KEYWORD && token < TOK_SYMBOL) {
-            buffer.printf("keyword \"%s\"", nameof(token));
         } else {
-            buffer.printf("symbol \"%s\"", nameof(token));
+            if (quote) {
+                if (token >= TOK_KEYWORD && token < TOK_SYMBOL) {
+                    buffer.printf("keyword \"%s\"", nameof(token));
+                } else {
+                    buffer.printf("symbol \"%s\"", nameof(token));
+                }
+            } else {
+                buffer.printf("%s", nameof(token));
+            }
         }
     }
 
@@ -4477,7 +4485,7 @@
         bool result = token >= TOK_SYMBOL;
         if (!result) {
             String temp;
-            decodeToken(temp, token);
+            decodeToken(temp, token, true);
             error("Expected symbol. Got %s", temp.getUnwrapped());
         }
         return result;
diff --git a/libacc/tests/data/rollo3.c b/libacc/tests/data/rollo3.c
new file mode 100644
index 0000000..b21c12f
--- /dev/null
+++ b/libacc/tests/data/rollo3.c
@@ -0,0 +1,9 @@
+
+float fabsf(float);
+
+int main(void* con, int ft, int launchID)
+{
+   float f =  fabsf(-10.0f);
+   return f;
+}
+
diff --git a/libacc/tests/test.py b/libacc/tests/test.py
index 3928277..1ae92ca 100644
--- a/libacc/tests/test.py
+++ b/libacc/tests/test.py
@@ -262,6 +262,10 @@
 Pointer comparison to zero: 0 0 1
 Pointer comparison: 1 0 0 0 1
 """)
+    def testRollo3(self):
+        self.compileCheck(["-R", "data/rollo3.c"], """Executing compiled code:
+result: 10""", """""")
+
 
 
 if __name__ == '__main__':