Skip to content
Snippets Groups Projects
Commit 52304776 authored by Roland Senn's avatar Roland Senn Committed by Ben Gamari
Browse files

Compiler panic on invalid syntax (unterminated pragma)

Summary: After a parse error in OPTIONS_GHC issue an error message instead of a compiler panic.

Test Plan: make test TEST=T15053

Reviewers: Phyx, thomie, bgamari, monoidal, osa1

Reviewed By: Phyx, monoidal, osa1

Subscribers: tdammers, osa1, rwbarton, carter

GHC Trac Issues: #15053

Differential Revision: https://phabricator.haskell.org/D5093

(cherry picked from commit df363a64)
parent 377975e0
No related branches found
No related tags found
No related merge requests found
...@@ -244,7 +244,8 @@ getOptions' dflags toks ...@@ -244,7 +244,8 @@ getOptions' dflags toks
| IToptions_prag str <- getToken open | IToptions_prag str <- getToken open
, ITclose_prag <- getToken close , ITclose_prag <- getToken close
= case toArgs str of = case toArgs str of
Left err -> panic ("getOptions'.parseToks: " ++ err) Left _err -> optionsParseError str dflags $ -- #15053
combineSrcSpans (getLoc open) (getLoc close)
Right args -> map (L (getLoc open)) args ++ parseToks xs Right args -> map (L (getLoc open)) args ++ parseToks xs
parseToks (open:close:xs) parseToks (open:close:xs)
| ITinclude_prag str <- getToken open | ITinclude_prag str <- getToken open
...@@ -314,17 +315,15 @@ checkExtension dflags (L l ext) ...@@ -314,17 +315,15 @@ checkExtension dflags (L l ext)
languagePragParseError :: DynFlags -> SrcSpan -> a languagePragParseError :: DynFlags -> SrcSpan -> a
languagePragParseError dflags loc = languagePragParseError dflags loc =
throw $ mkSrcErr $ unitBag $ throwErr dflags loc $
(mkPlainErrMsg dflags loc $
vcat [ text "Cannot parse LANGUAGE pragma" vcat [ text "Cannot parse LANGUAGE pragma"
, text "Expecting comma-separated list of language options," , text "Expecting comma-separated list of language options,"
, text "each starting with a capital letter" , text "each starting with a capital letter"
, nest 2 (text "E.g. {-# LANGUAGE TemplateHaskell, GADTs #-}") ]) , nest 2 (text "E.g. {-# LANGUAGE TemplateHaskell, GADTs #-}") ]
unsupportedExtnError :: DynFlags -> SrcSpan -> String -> a unsupportedExtnError :: DynFlags -> SrcSpan -> String -> a
unsupportedExtnError dflags loc unsup = unsupportedExtnError dflags loc unsup =
throw $ mkSrcErr $ unitBag $ throwErr dflags loc $
mkPlainErrMsg dflags loc $
text "Unsupported extension: " <> text unsup $$ text "Unsupported extension: " <> text unsup $$
if null suggestions then Outputable.empty else text "Perhaps you meant" <+> quotedListWithOr (map text suggestions) if null suggestions then Outputable.empty else text "Perhaps you meant" <+> quotedListWithOr (map text suggestions)
where where
...@@ -340,3 +339,14 @@ optionsErrorMsgs dflags unhandled_flags flags_lines _filename ...@@ -340,3 +339,14 @@ optionsErrorMsgs dflags unhandled_flags flags_lines _filename
ErrUtils.mkPlainErrMsg dflags flagSpan $ ErrUtils.mkPlainErrMsg dflags flagSpan $
text "unknown flag in {-# OPTIONS_GHC #-} pragma:" <+> text flag text "unknown flag in {-# OPTIONS_GHC #-} pragma:" <+> text flag
optionsParseError :: String -> DynFlags -> SrcSpan -> a -- #15053
optionsParseError str dflags loc =
throwErr dflags loc $
vcat [ text "Error while parsing OPTIONS_GHC pragma."
, text "Expecting whitespace-separated list of GHC options."
, text " E.g. {-# OPTIONS_GHC -Wall -O2 #-}"
, text ("Input was: " ++ show str) ]
throwErr :: DynFlags -> SrcSpan -> SDoc -> a -- #15053
throwErr dflags loc doc =
throw $ mkSrcErr $ unitBag $ mkPlainErrMsg dflags loc doc
T15053.hs:1:16:
Error while parsing OPTIONS_GHC pragma.
Expecting whitespace-separated list of GHC options.
E.g. {-# OPTIONS_GHC -Wall -O2 #-}
Input was: " -O1 }/n/"/n "
...@@ -125,4 +125,4 @@ test('typeops_A', normal, compile_fail, ['']) ...@@ -125,4 +125,4 @@ test('typeops_A', normal, compile_fail, [''])
test('typeops_B', normal, compile_fail, ['']) test('typeops_B', normal, compile_fail, [''])
test('typeops_C', normal, compile_fail, ['']) test('typeops_C', normal, compile_fail, [''])
test('typeops_D', normal, compile_fail, ['']) test('typeops_D', normal, compile_fail, [''])
test('T15053', expect_broken(15053), compile_fail, ['']) # shouldn't panic test('T15053', normal, compile_fail, [''])
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