diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+### 0.20.2
+
++ Fix fromGVariant for empty arrays, see [#91](https://github.com/haskell-gi/haskell-gi/issues/91) for details.
+
 ### 0.20.1
 
 + Add Data.GI.Base.CallStack, abstracting (and backporting to the
diff --git a/Data/GI/Base/BasicConversions.hsc b/Data/GI/Base/BasicConversions.hsc
--- a/Data/GI/Base/BasicConversions.hsc
+++ b/Data/GI/Base/BasicConversions.hsc
@@ -1,4 +1,4 @@
-{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE ScopedTypeVariables, ConstraintKinds, FlexibleContexts #-}
 {-# OPTIONS_GHC -fno-warn-name-shadowing #-}
 module Data.GI.Base.BasicConversions
     ( gflagsToWord
@@ -75,6 +75,7 @@
 import qualified Data.ByteString.Internal as BI
 import Data.Maybe (fromMaybe)
 import Data.Text (Text)
+import qualified Data.Text as T
 import qualified Data.Text.Foreign as TF
 
 import Foreign.Ptr (Ptr, plusPtr, nullPtr, nullFunPtr, castPtr)
@@ -87,9 +88,11 @@
 import Data.Bits (Bits, (.|.), (.&.), shift)
 
 import Data.GI.Base.BasicTypes
+import Data.GI.Base.CallStack (HasCallStack)
 import Data.GI.Base.GHashTable (GEqualFunc, GHashFunc)
 import Data.GI.Base.ManagedPtr (copyBoxedPtr)
-import Data.GI.Base.Utils (allocBytes, callocBytes, memcpy, freeMem)
+import Data.GI.Base.Utils (allocBytes, callocBytes, memcpy, freeMem,
+                           checkUnexpectedReturnNULL)
 
 #include <glib-object.h>
 
@@ -370,7 +373,7 @@
                                poke ptr cstring
                                fill (ptr `plusPtr` sizeOf cstring) xs
 
-unpackZeroTerminatedUTF8CArray :: Ptr CString -> IO [Text]
+unpackZeroTerminatedUTF8CArray :: HasCallStack => Ptr CString -> IO [Text]
 unpackZeroTerminatedUTF8CArray listPtr = go listPtr
     where go :: Ptr CString -> IO [Text]
           go ptr = do
@@ -380,7 +383,8 @@
                else (:) <$> cstringToText cstring
                         <*> go (ptr `plusPtr` sizeOf cstring)
 
-unpackUTF8CArrayWithLength :: Integral a => a -> Ptr CString -> IO [Text]
+unpackUTF8CArrayWithLength :: (HasCallStack, Integral a) =>
+                              a -> Ptr CString -> IO [Text]
 unpackUTF8CArrayWithLength n ptr = go (fromIntegral n) ptr
     where go       :: Int -> Ptr CString -> IO [Text]
           go 0 _   = return []
@@ -414,7 +418,7 @@
                                poke ptr cstring
                                fill (ptr `plusPtr` sizeOf cstring) xs
 
-unpackZeroTerminatedFileNameArray :: Ptr CString -> IO [String]
+unpackZeroTerminatedFileNameArray :: HasCallStack => Ptr CString -> IO [String]
 unpackZeroTerminatedFileNameArray listPtr = go listPtr
     where go :: Ptr CString -> IO [String]
           go ptr = do
@@ -424,7 +428,7 @@
                else (:) <$> cstringToString cstring
                         <*> go (ptr `plusPtr` sizeOf cstring)
 
-unpackFileNameArrayWithLength :: Integral a =>
+unpackFileNameArrayWithLength :: (HasCallStack, Integral a) =>
                                  a -> Ptr CString -> IO [String]
 unpackFileNameArrayWithLength n ptr = go (fromIntegral n) ptr
     where go       :: Int -> Ptr CString -> IO [String]
@@ -442,8 +446,10 @@
 stringToCString :: String -> IO CString
 stringToCString str = withCString str g_strdup
 
-cstringToString :: CString -> IO String
-cstringToString = peekCString
+cstringToString :: HasCallStack => CString -> IO String
+cstringToString cstr = do
+  checkUnexpectedReturnNULL (T.pack "cstringToString") cstr
+  peekCString cstr
 
 foreign import ccall "g_strndup" g_strndup ::
     CString -> #{type gsize} -> IO CString
@@ -463,8 +469,9 @@
 foreign import ccall "strlen" c_strlen ::
     CString -> IO (CSize)
 
-cstringToText :: CString -> IO Text
+cstringToText :: HasCallStack => CString -> IO Text
 cstringToText cstr = do
+  checkUnexpectedReturnNULL (T.pack "cstringToText") cstr
   len <- c_strlen cstr
   let cstrlen = (cstr, fromIntegral len)
   TF.peekCStringLen cstrlen
@@ -472,8 +479,10 @@
 byteStringToCString :: ByteString -> IO CString
 byteStringToCString bs = B.useAsCString bs g_strdup
 
-cstringToByteString :: CString -> IO ByteString
-cstringToByteString = B.packCString
+cstringToByteString :: HasCallStack => CString -> IO ByteString
+cstringToByteString cstr = do
+  checkUnexpectedReturnNULL (T.pack "cstringToByteString") cstr
+  B.packCString cstr
 
 packPtrArray :: [Ptr a] -> IO (Ptr (Ptr a))
 packPtrArray items = do
diff --git a/Data/GI/Base/GVariant.hsc b/Data/GI/Base/GVariant.hsc
--- a/Data/GI/Base/GVariant.hsc
+++ b/Data/GI/Base/GVariant.hsc
@@ -636,8 +636,13 @@
 gvariant_get_children :: (Ptr GVariant) -> IO [GVariant]
 gvariant_get_children vptr = do
       n_children <- g_variant_n_children vptr
-      mapM ((g_variant_get_child_value vptr) >=> wrapGVariantPtr)
-               [0..(n_children-1)]
+      -- n_children is an unsigned type (Word64 in 64 bit
+      -- architectures), so if it is 0 and we substract one we would
+      -- wrap around to 2^64-1.
+      if n_children /= 0
+        then mapM ((g_variant_get_child_value vptr) >=> wrapGVariantPtr)
+             [0..(n_children-1)]
+        else return []
 
 instance IsGVariant a => IsGVariant (Maybe a) where
     toGVariant   = gvariantFromMaybe
diff --git a/Data/GI/Base/Utils.hsc b/Data/GI/Base/Utils.hsc
--- a/Data/GI/Base/Utils.hsc
+++ b/Data/GI/Base/Utils.hsc
@@ -193,7 +193,7 @@
 
 -- | An annotated version of `fromJust`, which raises a
 -- `UnexpectedNullPointerReturn` in case it encounters a `Nothing`.
-checkUnexpectedNothing :: T.Text -> IO (Maybe a) -> IO a
+checkUnexpectedNothing :: HasCallStack => T.Text -> IO (Maybe a) -> IO a
 checkUnexpectedNothing fnName action = do
   result <- action
   case result of
diff --git a/haskell-gi-base.cabal b/haskell-gi-base.cabal
--- a/haskell-gi-base.cabal
+++ b/haskell-gi-base.cabal
@@ -1,5 +1,5 @@
 name:                haskell-gi-base
-version:             0.20.1
+version:             0.20.2
 synopsis:            Foundation for libraries generated by haskell-gi
 description:         Foundation for libraries generated by haskell-gi
 homepage:            https://github.com/haskell-gi/haskell-gi-base
