Skip to content
Snippets Groups Projects
Commit 2b3026ff authored by Cheng Shao's avatar Cheng Shao
Browse files

Use base CClockId as ClockId type

We used to define ClockId as hsc2hs-detected ${type clockid_t} type.
Unfortunately, certain libcs (e.g. wasi-libc) define clockid_t as a
pointer type, and hsc2hs only supports detecting C
integral/floating-point types, so clockid_t will mistakenly be
detected as a floating-point type, resulting in incorrect code
generation.

We should really just use the base CClockId type here. base handles C
pointer types correctly, since it uses its own custom autoconf logic
instead of hsc2hs, and similar issues have been reported & fixed
before, see ghc/ghc!6896
and ghc/ghc!6912.

Also make tzset conditional.
parent baab563e
No related branches found
No related tags found
No related merge requests found
......@@ -17,6 +17,7 @@ AC_CHECK_HEADERS([time.h])
AC_CHECK_FUNCS([gmtime_r localtime_r])
AC_CHECK_FUNCS([clock_gettime])
AC_CHECK_FUNCS([tzset])
AC_STRUCT_TM
AC_STRUCT_TIMEZONE
......
......@@ -9,10 +9,11 @@ module Data.Time.Clock.Internal.CTimespec where
import Foreign
import Foreign.C
import System.IO.Unsafe
import System.Posix.Types
#include <time.h>
type ClockID = #{type clockid_t}
type ClockID = CClockId
data CTimespec = MkCTimespec CTime CLong
......@@ -51,7 +52,7 @@ clockGetTime clockid = alloca (\ptspec -> do
peek ptspec
)
foreign import capi unsafe "time.h value CLOCK_REALTIME" clock_REALTIME :: ClockID
foreign import capi unsafe "HsTime.h value HS_CLOCK_REALTIME" clock_REALTIME :: ClockID
clock_TAI :: Maybe ClockID
clock_TAI =
......
......@@ -10,7 +10,7 @@ long int get_current_timezone_seconds (time_t t,int* pdst,char const* * pname)
// as Microsoft considers the POSIX named `tzset()` function
// deprecated (see http://msdn.microsoft.com/en-us/library/ms235384.aspx)
_tzset();
#else
#elif defined(HAVE_TZSET)
tzset();
#endif
......
......@@ -18,6 +18,8 @@
#include <time.h>
#endif
#define HS_CLOCK_REALTIME (uintptr_t)(CLOCK_REALTIME)
long int get_current_timezone_seconds (time_t,int* pdst,char const* * pname);
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment