summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Scott <ryan.gl.scott@gmail.com>2019-11-13 10:35:11 -0500
committerMarge Bot <ben+marge-bot@smart-cactus.org>2019-11-23 18:56:00 -0500
commit15f1dc3316db0b07434862de8382b4ddd27fecca (patch)
tree20df1293713f01fd74a3a0bbc86908d63d119370
parent4a1e7e47f797fab4165b7cba05edc08d41f5d80e (diff)
downloadhaskell-15f1dc3316db0b07434862de8382b4ddd27fecca.tar.gz
Prevent -optc arguments from being duplicated in reverse order (#17471)
This reverts a part of commit 7bc5d6c6578ab9d60a83b81c7cc14819afef32ba that causes all arguments to `-optc` (and `-optcxx`) to be passed twice to the C/C++ compiler, once in reverse order and then again in the correct order. While passing duplicate arguments is usually harmless it can cause breakage in this pattern, which is employed by Hackage libraries in the wild: ``` ghc Foo.hs foo.c -optc-D -optcFOO ``` As `FOO -D -D FOO` will cause compilers to error. Fixes #17471.
-rw-r--r--compiler/main/SysTools/Tasks.hs5
-rw-r--r--testsuite/tests/ffi/should_run/T17471.hs9
-rw-r--r--testsuite/tests/ffi/should_run/T17471.stdout1
-rw-r--r--testsuite/tests/ffi/should_run/T17471_c.c7
-rw-r--r--testsuite/tests/ffi/should_run/all.T3
5 files changed, 22 insertions, 3 deletions
diff --git a/compiler/main/SysTools/Tasks.hs b/compiler/main/SysTools/Tasks.hs
index 5b0cb1cfa2..96a5b291da 100644
--- a/compiler/main/SysTools/Tasks.hs
+++ b/compiler/main/SysTools/Tasks.hs
@@ -127,10 +127,9 @@ runCc mLanguage dflags args = traceToolCommand dflags "cc" $ do
Nothing -> ([], userOpts_c)
Just language -> ([Option "-x", Option languageName], opts)
where
- s = settings dflags
(languageName, opts) = case language of
- LangC -> ("c", sOpt_c s ++ userOpts_c)
- LangCxx -> ("c++", sOpt_cxx s ++ userOpts_cxx)
+ LangC -> ("c", userOpts_c)
+ LangCxx -> ("c++", userOpts_cxx)
LangObjc -> ("objective-c", userOpts_c)
LangObjcxx -> ("objective-c++", userOpts_cxx)
LangAsm -> ("assembler", [])
diff --git a/testsuite/tests/ffi/should_run/T17471.hs b/testsuite/tests/ffi/should_run/T17471.hs
new file mode 100644
index 0000000000..bcaebc59cd
--- /dev/null
+++ b/testsuite/tests/ffi/should_run/T17471.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module Main where
+
+import Foreign.C.Types
+
+foreign import ccall "foo" foo :: IO CInt
+
+main :: IO ()
+main = foo >>= print
diff --git a/testsuite/tests/ffi/should_run/T17471.stdout b/testsuite/tests/ffi/should_run/T17471.stdout
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/testsuite/tests/ffi/should_run/T17471.stdout
@@ -0,0 +1 @@
+1
diff --git a/testsuite/tests/ffi/should_run/T17471_c.c b/testsuite/tests/ffi/should_run/T17471_c.c
new file mode 100644
index 0000000000..64a9445a62
--- /dev/null
+++ b/testsuite/tests/ffi/should_run/T17471_c.c
@@ -0,0 +1,7 @@
+int foo() {
+#if defined(FOO)
+ return 1;
+#else
+ return 0;
+#endif
+}
diff --git a/testsuite/tests/ffi/should_run/all.T b/testsuite/tests/ffi/should_run/all.T
index d379191548..a0984a28fe 100644
--- a/testsuite/tests/ffi/should_run/all.T
+++ b/testsuite/tests/ffi/should_run/all.T
@@ -213,3 +213,6 @@ test('PrimFFIWord16', [omit_ways(['ghci'])], compile_and_run, ['PrimFFIWord16_c.
test('T493', [omit_ways(['ghci'])], compile_and_run, ['T493_c.c'])
test('UnliftedNewtypesByteArrayOffset', [omit_ways(['ghci'])], compile_and_run, ['UnliftedNewtypesByteArrayOffset_c.c'])
+
+test('T17471', [omit_ways(['ghci'])], compile_and_run,
+ ['T17471_c.c -optc-D -optcFOO'])