From 66ed80491b46a2903ec4e961f9582a9e27fecde9 Mon Sep 17 00:00:00 2001
From: sof <unknown>
Date: Mon, 16 Nov 1998 11:56:13 +0000
Subject: [PATCH] [project @ 1998-11-16 11:56:09 by sof] Cleaned up the
 handling of the default calling conventions for 'foreign' decls

---
 ghc/compiler/absCSyn/CallConv.lhs  | 4 ++++
 ghc/compiler/parser/hsparser.y     | 4 ++--
 ghc/compiler/parser/utils.h        | 1 +
 ghc/compiler/reader/ReadPrefix.lhs | 7 ++++++-
 4 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/ghc/compiler/absCSyn/CallConv.lhs b/ghc/compiler/absCSyn/CallConv.lhs
index d09d063218fe..97a92bb27f2a 100644
--- a/ghc/compiler/absCSyn/CallConv.lhs
+++ b/ghc/compiler/absCSyn/CallConv.lhs
@@ -11,6 +11,7 @@ module CallConv
 
        , stdCallConv
        , cCallConv
+       , defaultCallConv
        , callConvAttribute
        , decorateExtName
        ) where
@@ -33,6 +34,9 @@ stdCallConv = 0
 
 cCallConv  :: CallConv
 cCallConv = 1
+
+defaultCallConv :: CallConv
+defaultCallConv = cCallConv
 \end{code}
 
 Generate the gcc attribute corresponding to the given
diff --git a/ghc/compiler/parser/hsparser.y b/ghc/compiler/parser/hsparser.y
index 30bfa6f2b7bb..d4befff5ebc5 100644
--- a/ghc/compiler/parser/hsparser.y
+++ b/ghc/compiler/parser/hsparser.y
@@ -555,8 +555,8 @@ callconv: STDCALL 	{ $$ = CALLCONV_STDCALL;  }
 	| C_CALL        { $$ = CALLCONV_CCALL;    }
 	| PASCAL        { $$ = CALLCONV_PASCAL;   }
 	| FASTCALL      { $$ = CALLCONV_FASTCALL; }
-/* If you leave out the specification of a calling convention, you'll get C's. */
-        | /*empty*/     { $$ = CALLCONV_CCALL;    }
+/* If you leave out the specification of a calling convention, you'll (probably) get C's. */
+        | /*empty*/     { $$ = CALLCONV_NONE;    }
 	;
 
 ext_name: STRING	{ $$ = mkjust(lsing($1)); }
diff --git a/ghc/compiler/parser/utils.h b/ghc/compiler/parser/utils.h
index 4ebf921a538e..76d0d0e5b3eb 100644
--- a/ghc/compiler/parser/utils.h
+++ b/ghc/compiler/parser/utils.h
@@ -115,6 +115,7 @@ void	checkprec PROTO((tree, qid, BOOLEAN));
 */
 
 /* FFI predefines */
+#define CALLCONV_NONE     (-1)
 #define CALLCONV_STDCALL  0
 #define CALLCONV_CCALL    1
 #define CALLCONV_PASCAL   2
diff --git a/ghc/compiler/reader/ReadPrefix.lhs b/ghc/compiler/reader/ReadPrefix.lhs
index 8024e08f6066..44e8e6295655 100644
--- a/ghc/compiler/reader/ReadPrefix.lhs
+++ b/ghc/compiler/reader/ReadPrefix.lhs
@@ -962,7 +962,12 @@ wlkExtName (U_just pt)
       [mod,nm] -> returnUgn (ExtName nm (Just mod))
 
 rdCallConv :: Int -> UgnM CallConv
-rdCallConv x = returnUgn x
+rdCallConv x = 
+   -- this tracks the #defines in parser/utils.h
+  case x of
+    (-1) -> -- no calling convention specified, use default.
+          returnUgn defaultCallConv
+    _    -> returnUgn x
 
 rdForKind :: Int -> Bool -> UgnM ForKind
 rdForKind 0 isUnsafe = -- foreign import
-- 
GitLab