Minor refactoring of placeHolderPunRhs
[ghc-hetmet.git] / compiler / main / DriverPipeline.hs
index f8073c9..0bac958 100644 (file)
@@ -696,19 +696,30 @@ runPhase (Unlit sf) _stop hsc_env _basename _suff input_fn get_output_fn maybe_l
 runPhase (Cpp sf) _stop hsc_env _basename _suff input_fn get_output_fn maybe_loc
   = do let dflags0 = hsc_dflags hsc_env
        src_opts <- liftIO $ getOptionsFromFile dflags0 input_fn
-       (dflags, unhandled_flags, warns)
+       (dflags1, unhandled_flags, warns)
            <- liftIO $ parseDynamicNoPackageFlags dflags0 src_opts
-       handleFlagWarnings dflags warns
        checkProcessArgsResult unhandled_flags
 
-       if not (dopt Opt_Cpp dflags) then
+       if not (dopt Opt_Cpp dflags1) then do
+           -- we have to be careful to emit warnings only once.
+           unless (dopt Opt_Pp dflags1) $ handleFlagWarnings dflags1 warns
+
            -- no need to preprocess CPP, just pass input file along
           -- to the next phase of the pipeline.
-          return (HsPp sf, dflags, maybe_loc, input_fn)
+           return (HsPp sf, dflags1, maybe_loc, input_fn)
        else do
-           output_fn <- liftIO $ get_output_fn dflags (HsPp sf) maybe_loc
-           liftIO $ doCpp dflags True{-raw-} False{-no CC opts-} input_fn output_fn
-           return (HsPp sf, dflags, maybe_loc, output_fn)
+           output_fn <- liftIO $ get_output_fn dflags1 (HsPp sf) maybe_loc
+           liftIO $ doCpp dflags1 True{-raw-} False{-no CC opts-} input_fn output_fn
+            -- re-read the pragmas now that we've preprocessed the file
+            -- See #2464,#3457
+            src_opts <- liftIO $ getOptionsFromFile dflags0 output_fn
+            (dflags2, unhandled_flags, warns)
+                <- liftIO $ parseDynamicNoPackageFlags dflags0 src_opts
+            unless (dopt Opt_Pp dflags2) $ handleFlagWarnings dflags2 warns
+            -- the HsPp pass below will emit warnings
+            checkProcessArgsResult unhandled_flags
+
+           return (HsPp sf, dflags2, maybe_loc, output_fn)
 
 -------------------------------------------------------------------------------
 -- HsPp phase 
@@ -730,7 +741,15 @@ runPhase (HsPp sf) _stop hsc_env basename suff input_fn get_output_fn maybe_loc
                             ] ++
                             map SysTools.Option hspp_opts
                           )
-           return (Hsc sf, dflags, maybe_loc, output_fn)
+
+            -- re-read pragmas now that we've parsed the file (see #3674)
+            src_opts <- liftIO $ getOptionsFromFile dflags output_fn
+            (dflags1, unhandled_flags, warns)
+                <- liftIO $ parseDynamicNoPackageFlags dflags src_opts
+            handleFlagWarnings dflags1 warns
+            checkProcessArgsResult unhandled_flags
+
+           return (Hsc sf, dflags1, maybe_loc, output_fn)
 
 -----------------------------------------------------------------------------
 -- Hsc phase
@@ -1374,7 +1393,7 @@ linkBinary dflags o_files dep_packages = do
 
     pkg_lib_paths <- getPackageLibraryPath dflags dep_packages
     let pkg_lib_path_opts = concat (map get_pkg_lib_path_opts pkg_lib_paths)
-#ifdef linux_TARGET_OS
+#ifdef elf_OBJ_FORMAT
         get_pkg_lib_path_opts l | (dynLibLoader dflags)==SystemDependent && not opt_Static = ["-L" ++ l, "-Wl,-rpath", "-Wl," ++ l]
                                 | otherwise = ["-L" ++ l]
 #else
@@ -1573,7 +1592,7 @@ linkDynLib dflags o_files dep_packages = do
 #endif
     let pkg_lib_paths = collectLibraryPaths pkgs_no_rts
     let pkg_lib_path_opts = concatMap get_pkg_lib_path_opts pkg_lib_paths
-#ifdef linux_TARGET_OS
+#ifdef elf_OBJ_FORMAT
         get_pkg_lib_path_opts l | (dynLibLoader dflags)==SystemDependent && not opt_Static = ["-L" ++ l, "-Wl,-rpath", "-Wl," ++ l]
                                 | otherwise = ["-L" ++ l]
 #else