on master help sign in
Require at least one Def in recursive declarations
3ee017eEvan Czaplicki
compiler/src/AST/Canonical.hs+1−1
@@ -128,7 +128,7 @@ data Def
128
128
129data Decls
129data Decls
130 = Declare Def Decls
130 = Declare Def Decls
131− | DeclareRec [Def] Decls
131+ | DeclareRec Def [Def] Decls
132 | SaveTheEnvironment
132 | SaveTheEnvironment
133
133
134
134
compiler/src/Canonicalize/Module.hs+20−8
@@ -93,13 +93,11 @@ detectCycles sccs =
93 Graph.AcyclicSCC (def, _, _) ->
93 Graph.AcyclicSCC (def, _, _) ->
94 Can.Declare def <$> detectCycles otherSccs
94 Can.Declare def <$> detectCycles otherSccs
95
95
96− Graph.CyclicSCC [] ->
97− detectCycles otherSccs
98−
99 Graph.CyclicSCC subNodes ->
96 Graph.CyclicSCC subNodes ->
100− Can.DeclareRec
101− <$> traverse detectBadCycles (Graph.stronglyConnComp subNodes)
97+ do defs <- traverse detectBadCycles (Graph.stronglyConnComp subNodes)
98+ case defs of
99+ [] -> detectCycles otherSccs
102− <*> detectCycles otherSccs
100+ d:ds -> Can.DeclareRec d ds <$> detectCycles otherSccs
103
101
104
102
105detectBadCycles :: Graph.SCC Can.Def -> Result i w Can.Def
103detectBadCycles :: Graph.SCC Can.Def -> Result i w Can.Def
@@ -108,8 +106,22 @@ detectBadCycles scc =
108 Graph.AcyclicSCC def ->
106 Graph.AcyclicSCC def ->
109 Result.ok def
107 Result.ok def
110
108
111− Graph.CyclicSCC cyclicValueDefs ->
109+ Graph.CyclicSCC [] ->
110+ error "The definition of Data.Graph.SCC should not allow empty CyclicSCC!"
111+
112+ Graph.CyclicSCC (def:defs) ->
113+ let
114+ (A.At region name) = extractDefName def
115+ names = map (A.toValue . extractDefName) defs
116+ in
112− Result.throw (Error.RecursiveDecl cyclicValueDefs)
117+ Result.throw (Error.RecursiveDecl region name names)
118+
119+
120+extractDefName :: Can.Def -> A.Located Name.Name
121+extractDefName def =
122+ case def of
123+ Can.Def name _ _ -> name
124+ Can.TypedDef name _ _ _ _ -> name
113
125
114
126
115
127