@@ -561,26 +561,38 @@ module TcRecdUnionAndEnumDeclarations =
561561 let unionCasesR = unionCases |> List.map ( TcUnionCaseDecl cenv env parent thisTy thisTyInst tpenv hasRQAAttribute)
562562 unionCasesR |> CheckDuplicates ( fun uc -> uc.Id) " union case"
563563
564- let TcEnumDecl cenv env parent thisTy fieldTy ( SynEnumCase ( attributes = Attributes synAttrs; ident= SynIdent( id,_); value= v; xmlDoc= xmldoc; range= m)) =
564+ let MakeEnumCaseSpec cenv env parent attrs thisTy caseRange ( caseIdent : Ident ) ( xmldoc : PreXmlDoc ) value =
565+ let vis , _ = ComputeAccessAndCompPath env None caseRange None None parent
566+ let vis = CombineReprAccess parent vis
567+ if caseIdent.idText = " value__" then errorR( Error( FSComp.SR.tcNotValidEnumCaseName(), caseIdent.idRange))
568+ let checkXmlDocs = cenv.diagnosticOptions.CheckXmlDocs
569+ let xmlDoc = xmldoc.ToXmlDoc( checkXmlDocs, Some [])
570+ Construct.NewRecdField true ( Some value) caseIdent false thisTy false false [] attrs xmlDoc vis false
571+
572+ let TcEnumDecl cenv env tpenv parent thisTy fieldTy ( SynEnumCase ( attributes = Attributes synAttrs; ident = SynIdent ( id, _); valueExpr = valueExpr; xmlDoc = xmldoc; range = caseRange)) =
565573 let attrs = TcAttributes cenv env AttributeTargets.Field synAttrs
566-
567- match v with
568- | SynConst.Bytes _
569- | SynConst.UInt16s _
570- | SynConst.UserNum _ -> error( Error( FSComp.SR.tcInvalidEnumerationLiteral(), m))
571- | _ ->
572- let v = TcConst cenv fieldTy m env v
573- let vis , _ = ComputeAccessAndCompPath env None m None None parent
574- let vis = CombineReprAccess parent vis
575- if id.idText = " value__" then errorR( Error( FSComp.SR.tcNotValidEnumCaseName(), id.idRange))
576- let checkXmlDocs = cenv.diagnosticOptions.CheckXmlDocs
577- let xmlDoc = xmldoc.ToXmlDoc( checkXmlDocs, Some [])
578- Construct.NewRecdField true ( Some v) id false thisTy false false [] attrs xmlDoc vis false
579-
580- let TcEnumDecls ( cenv : cenv ) env parent thisTy enumCases =
574+ let valueRange = valueExpr.Range
575+
576+ match valueExpr with
577+ | SynExpr.Const ( constant = SynConst.Bytes _ | SynConst.UInt16s _ | SynConst.UserNum _) ->
578+ error( Error( FSComp.SR.tcInvalidEnumerationLiteral(), valueRange))
579+ | SynExpr.Const ( synConst, _) ->
580+ let konst = TcConst cenv fieldTy valueRange env synConst
581+ MakeEnumCaseSpec cenv env parent attrs thisTy caseRange id xmldoc konst
582+ | _ when cenv.g.langVersion.SupportsFeature LanguageFeature.ArithmeticInLiterals ->
583+ let expr , actualTy , _ = TcExprOfUnknownType cenv env tpenv valueExpr
584+ UnifyTypes cenv env valueRange fieldTy actualTy
585+
586+ match EvalLiteralExprOrAttribArg cenv.g expr with
587+ | Expr.Const ( konst, _, _) -> MakeEnumCaseSpec cenv env parent attrs thisTy caseRange id xmldoc konst
588+ | _ -> error( Error( FSComp.SR.tcInvalidEnumerationLiteral(), valueRange))
589+ | _ ->
590+ error( Error( FSComp.SR.tcInvalidEnumerationLiteral(), valueRange))
591+
592+ let TcEnumDecls ( cenv : cenv ) env tpenv parent thisTy enumCases =
581593 let g = cenv.g
582594 let fieldTy = NewInferenceType g
583- let enumCases ' = enumCases |> List.map ( TcEnumDecl cenv env parent thisTy fieldTy) |> CheckDuplicates ( fun f -> f.Id) " enum element"
595+ let enumCases ' = enumCases |> List.map ( TcEnumDecl cenv env tpenv parent thisTy fieldTy) |> CheckDuplicates ( fun f -> f.Id) " enum element"
584596 fieldTy, enumCases'
585597
586598//-------------------------------------------------------------------------
@@ -3483,7 +3495,7 @@ module EstablishTypeDefinitionCores =
34833495 repr, baseValOpt, safeInitInfo
34843496
34853497 | SynTypeDefnSimpleRepr.Enum ( decls, m) ->
3486- let fieldTy , fields' = TcRecdUnionAndEnumDeclarations.TcEnumDecls cenv envinner innerParent thisTy decls
3498+ let fieldTy , fields' = TcRecdUnionAndEnumDeclarations.TcEnumDecls cenv envinner tpenv innerParent thisTy decls
34873499 let kind = TFSharpEnum
34883500 structLayoutAttributeCheck false
34893501 noCLIMutableAttributeCheck()
@@ -3492,7 +3504,7 @@ module EstablishTypeDefinitionCores =
34923504 let vid = ident( " value__" , m)
34933505 let vfld = Construct.NewRecdField false None vid false fieldTy false false [] [] XmlDoc.Empty taccessPublic true
34943506
3495- let legitEnumTypes = [ g.int32_ ty; g.int16_ ty; g.sbyte_ ty; g.int64_ ty; g.char_ ty; g.bool _ ty ; g. uint32_ ty; g.uint16_ ty; g.byte_ ty; g.uint64_ ty ]
3507+ let legitEnumTypes = [ g.int32_ ty; g.int16_ ty; g.sbyte_ ty; g.int64_ ty; g.char_ ty; g.uint32_ ty; g.uint16_ ty; g.byte_ ty; g.uint64_ ty ]
34963508 if not ( ListSet.contains ( typeEquiv g) fieldTy legitEnumTypes) then
34973509 errorR( Error( FSComp.SR.tcInvalidTypeForLiteralEnumeration(), m))
34983510
0 commit comments