diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -323,7 +323,7 @@
   -- These flags will be passed to the C compiler
   cc-options:          -Wall -O2
   -- Libraries to link the code with.
-  extra-libraries:     -lm
+  extra-libraries:     m
   ...
 ```
 
diff --git a/inline-c.cabal b/inline-c.cabal
--- a/inline-c.cabal
+++ b/inline-c.cabal
@@ -1,5 +1,5 @@
 name:                inline-c
-version:             0.5.4.3
+version:             0.5.5.0
 synopsis:            Write Haskell source files including C code inline. No FFI required.
 description:         See <https://github.com/fpco/inline-c/blob/master/README.md>.
 license:             MIT
@@ -27,6 +27,7 @@
                      , Language.C.Inline.HaskellIdentifier
                      , Language.C.Inline.Internal
                      , Language.C.Inline.Unsafe
+                     , Language.C.Inline.Interruptible
                      , Language.C.Types
                      , Language.C.Types.Parse
   other-modules:       Language.C.Inline.FunPtr
@@ -90,7 +91,7 @@
     build-depends:     base >=4 && <5
                      , inline-c
                      , vector
-                     , Chart
+                     , Chart >= 1.3
                      , Chart-cairo
   else
     buildable: False
diff --git a/src/Language/C/Inline/Interruptible.hs b/src/Language/C/Inline/Interruptible.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Inline/Interruptible.hs
@@ -0,0 +1,46 @@
+{-# LANGUAGE CPP #-}
+
+-- | @interruptible@ variants of the "Language.C.Inline" quasi-quoters, to call
+-- interruptible C code. See <https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ffi.html#ffi-interruptible>
+-- for more information.
+--
+-- This module is intended to be imported qualified:
+--
+-- @
+-- import qualified "Language.C.Inline.Interruptible" as CI
+-- @
+
+module Language.C.Inline.Interruptible
+  ( exp
+  , pure
+  , block
+  ) where
+
+#if __GLASGOW_HASKELL__ < 710
+import           Prelude hiding (exp)
+#else
+import           Prelude hiding (exp, pure)
+#endif
+
+import qualified Language.Haskell.TH.Quote as TH
+import qualified Language.Haskell.TH.Syntax as TH
+
+import           Language.C.Inline.Context
+import           Language.C.Inline.Internal
+
+-- | C expressions.
+exp :: TH.QuasiQuoter
+exp = genericQuote IO $ inlineExp TH.Interruptible
+
+-- | Variant of 'exp', for use with expressions known to have no side effects.
+--
+-- BEWARE: use this function with caution, only when you know what you are
+-- doing. If an expression does in fact have side-effects, then indiscriminate
+-- use of 'pure' may endanger referential transparency, and in principle even
+-- type safety.
+pure :: TH.QuasiQuoter
+pure = genericQuote Pure $ inlineExp TH.Interruptible
+
+-- | C code blocks (i.e. statements).
+block :: TH.QuasiQuoter
+block = genericQuote IO $ inlineItems TH.Interruptible
diff --git a/test/tests.c b/test/tests.c
--- a/test/tests.c
+++ b/test/tests.c
@@ -40,67 +40,72 @@
 }
 
 
-void inline_c_Main_5_bbad659b194c6226bc20ec8262bc1c599dddeb28() {
+int inline_c_Main_5_f58397f6204cd35d25406cea930cdd76127e7a8d(int x_inline_c_0, int y_inline_c_1) {
+return ( 7 + x_inline_c_0 + y_inline_c_1 );
+}
+
+
+void inline_c_Main_6_bbad659b194c6226bc20ec8262bc1c599dddeb28() {
  printf("Hello\n") ;
 }
 
 
-ptrdiff_t inline_c_Main_6_4475cd73db749194709e394483ff3e5205688ff8(ptrdiff_t x_inline_c_0) {
+ptrdiff_t inline_c_Main_7_4475cd73db749194709e394483ff3e5205688ff8(ptrdiff_t x_inline_c_0) {
  char a[2]; return &a[1] - &a[0] + x_inline_c_0; 
 }
 
 
-size_t inline_c_Main_7_9782c357435fb488c3166bf10e839da13328001e() {
+size_t inline_c_Main_8_9782c357435fb488c3166bf10e839da13328001e() {
 return ( sizeof (char) );
 }
 
 
-uintmax_t inline_c_Main_8_c0df91f70bbf1f85671339d1bdc524414e112cc2() {
+uintmax_t inline_c_Main_9_c0df91f70bbf1f85671339d1bdc524414e112cc2() {
 return ( UINTMAX_MAX );
 }
 
 
-int16_t inline_c_Main_9_9e29ba00e56a81c765067e09a3136fa5232d49a0(int16_t x_inline_c_0) {
+int16_t inline_c_Main_10_9e29ba00e56a81c765067e09a3136fa5232d49a0(int16_t x_inline_c_0) {
 return ( 1 + x_inline_c_0 );
 }
 
 
-uint32_t inline_c_Main_10_08a42fa8f755a36db897898b73bb7aab5b1b58e1(uint32_t y_inline_c_0) {
+uint32_t inline_c_Main_11_08a42fa8f755a36db897898b73bb7aab5b1b58e1(uint32_t y_inline_c_0) {
 return ( y_inline_c_0 * 7 );
 }
 
 
-int inline_c_Main_11_4ffe4d055df0966eedc85f08247aa8880402694a(int (* ackermannPtr_inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) {
+int inline_c_Main_12_4ffe4d055df0966eedc85f08247aa8880402694a(int (* ackermannPtr_inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) {
 return ( ackermannPtr_inline_c_0(x_inline_c_1, y_inline_c_2) );
 }
 
 
-int (* inline_c_Main_12_7e6957a671db751a0a5b5e9721b3c45002fab68f())(int , int ) {
+int (* inline_c_Main_13_7e6957a671db751a0a5b5e9721b3c45002fab68f())(int , int ) {
 return ( &francescos_add );
 }
 
 
-int inline_c_Main_13_55555bbb777d25d03fef0a6d6ce9193474a74a35(int (* ackermann__inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) {
+int inline_c_Main_14_55555bbb777d25d03fef0a6d6ce9193474a74a35(int (* ackermann__inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) {
 return ( ackermann__inline_c_0(x_inline_c_1, y_inline_c_2) );
 }
 
 
-int inline_c_Main_14_4ffe4d055df0966eedc85f08247aa8880402694a(int (* ackermannPtr_inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) {
+int inline_c_Main_15_4ffe4d055df0966eedc85f08247aa8880402694a(int (* ackermannPtr_inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) {
 return ( ackermannPtr_inline_c_0(x_inline_c_1, y_inline_c_2) );
 }
 
 
-int inline_c_Main_15_b7d965842e65c49fcc08b03f70454988290e61e4(int (* ackermann_inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) {
+int inline_c_Main_16_b7d965842e65c49fcc08b03f70454988290e61e4(int (* ackermann_inline_c_0)(int , int ), int x_inline_c_1, int y_inline_c_2) {
 return ( ackermann_inline_c_0(x_inline_c_1, y_inline_c_2) );
 }
 
 
-double inline_c_Main_16_5dce1654ef6186acdb189a6ce36f0a66660eb346(double (* fun_inline_c_0)(double )) {
+double inline_c_Main_17_5dce1654ef6186acdb189a6ce36f0a66660eb346(double (* fun_inline_c_0)(double )) {
 return ( fun_inline_c_0(3.0) );
 }
 
 
-int inline_c_Main_17_8d0f093895f51773152915c33b75c7aafd8f4f45(int n_inline_c_0, int * ptr_inline_c_1) {
+int inline_c_Main_18_8d0f093895f51773152915c33b75c7aafd8f4f45(int n_inline_c_0, int * ptr_inline_c_1) {
 
         int i;
         int x = 0;
@@ -112,7 +117,7 @@
 }
 
 
-int inline_c_Main_18_62ce8aade5e693f134c6a5c9add3523edab1a63e(long vec_inline_c_0, int * vec_inline_c_1) {
+int inline_c_Main_19_62ce8aade5e693f134c6a5c9add3523edab1a63e(long vec_inline_c_0, int * vec_inline_c_1) {
 
         int i;
         int x = 0;
@@ -124,7 +129,7 @@
 }
 
 
-int inline_c_Main_19_75f1401fb8545756b6d329a5352a252bf52db946(long bs_inline_c_0, char * bs_inline_c_1) {
+int inline_c_Main_20_75f1401fb8545756b6d329a5352a252bf52db946(long bs_inline_c_0, char * bs_inline_c_1) {
 
           int i, bits = 0;
           for (i = 0; i < bs_inline_c_0; i++) {
@@ -136,17 +141,17 @@
 }
 
 
-int inline_c_Main_20_6fa3d382d3ab7f6d57eec7fbfe64e87fbc2a0ca9(int x_27_inline_c_0) {
+int inline_c_Main_21_6fa3d382d3ab7f6d57eec7fbfe64e87fbc2a0ca9(int x_27_inline_c_0) {
 return ( x_27_inline_c_0 );
 }
 
 
-int inline_c_Main_21_dbf060cb8fa2b86c6c6838ef9b645ac20f38ba79(int _e4_inline_c_0) {
+int inline_c_Main_22_dbf060cb8fa2b86c6c6838ef9b645ac20f38ba79(int _e4_inline_c_0) {
 return ( _e4_inline_c_0 );
 }
 
 
-int inline_c_Main_22_2421969c444755bea2c6f2060e0921ce7f3d16d7(int PreludemaxBound_2e_inline_c_0) {
+int inline_c_Main_23_2421969c444755bea2c6f2060e0921ce7f3d16d7(int PreludemaxBound_2e_inline_c_0) {
 return ( PreludemaxBound_2e_inline_c_0 );
 }
 
diff --git a/test/tests.hs b/test/tests.hs
--- a/test/tests.hs
+++ b/test/tests.hs
@@ -13,6 +13,7 @@
 
 import qualified Language.C.Inline as C
 import qualified Language.C.Inline.Unsafe as CU
+import qualified Language.C.Inline.Interruptible as CI
 import qualified Language.C.Inline.Internal as C
 import qualified Language.C.Inline.ContextSpec
 import qualified Language.C.Inline.ParseSpec
@@ -82,6 +83,11 @@
       let x = 2
       let y = 10
       z <- [CU.exp| int{ 7 + $(int x) + $(int y) } |]
+      z `Hspec.shouldBe` x + y + 7
+    Hspec.it "interruptible exp" $ do
+      let x = 2
+      let y = 10
+      z <- [CI.exp| int{ 7 + $(int x) + $(int y) } |]
       z `Hspec.shouldBe` x + y + 7
     Hspec.it "void exp" $ do
       [C.exp| void { printf("Hello\n") } |]
