Skip to content
Snippets Groups Projects
  1. Feb 08, 2024
    • Ben Gamari's avatar
      Move `base` to `ghc-internal` · 44f6557a
      Ben Gamari authored and Marge Bot's avatar Marge Bot committed
      Here we move a good deal of the implementation of `base` into a new
      package, `ghc-internal` such that it can be evolved independently
      from the user-visible interfaces of `base`.
      
      While we want to isolate implementation from interfaces, naturally, we
      would like to avoid turning `base` into a mere set of module re-exports.
      However, this is a non-trivial undertaking for a variety of reasons:
      
       * `base` contains numerous known-key and wired-in things, requiring
         corresponding changes in the compiler
      
       * `base` contains a significant amount of C code and corresponding
         autoconf logic, which is very fragile and difficult to break apart
      
       * `base` has numerous import cycles, which are currently dealt with via
         carefully balanced `hs-boot` files
      
       * We must not break existing users
      
      To accomplish this migration, I tried the following approaches:
      
      * [Split-GHC.Base]: Break apart the GHC.Base knot to allow incremental
        migration of modules into ghc-internal: this knot is simply too
        intertwined to be easily pulled apart, especially given the rather
        tricky import cycles that it contains)
      
      * [Move-Core]: Moving the "core" connected component of base (roughly
        150 modules) into ghc-internal. While the Haskell side of this seems
        tractable, the C dependencies are very subtle to break apart.
      
      * [Move-Incrementally]:
      
        1. Move all of base into ghc-internal
        2. Examine the module structure and begin moving obvious modules (e.g.
           leaves of the import graph) back into base
        3. Examine the modules remaining in ghc-internal, refactor as necessary
           to facilitate further moves
        4. Go to (2) iterate until the cost/benefit of further moves is
           insufficient to justify continuing
        5. Rename the modules moved into ghc-internal to ensure that they don't
           overlap with those in base
        6. For each module moved into ghc-internal, add a shim module to base
           with the declarations which should be exposed and any requisite
           Haddocks (thus guaranteeing that base will be insulated from changes
           in the export lists of modules in ghc-internal
      
      Here I am using the [Move-Incrementally] approach, which is empirically
      the least painful of the unpleasant options above
      
      Bumps haddock submodule.
      
      Metric Decrease:
          haddock.Cabal
          haddock.base
      Metric Increase:
          MultiComponentModulesRecomp
          T16875
          size_hello_artifact
      44f6557a
  2. Feb 05, 2024
  3. Feb 01, 2024
    • Andrei Borzenkov's avatar
      Namespacing for WARNING/DEPRECATED pragmas (#24396) · 151dda4e
      Andrei Borzenkov authored and Marge Bot's avatar Marge Bot committed
      New syntax for WARNING and DEPRECATED pragmas was added,
      namely namespace specifierss:
      
        namespace_spec ::= 'type' | 'data' | {- empty -}
      
        warning ::= warning_category namespace_spec namelist strings
      
        deprecation ::= namespace_spec namelist strings
      
      A new data type was introduced to represent these namespace specifiers:
      
        data NamespaceSpecifier =
          NoSpecifier |
          TypeNamespaceSpecifier (EpToken "type") |
          DataNamespaceSpecifier (EpToken "data")
      
      Extension field XWarning now contains this NamespaceSpecifier.
      
      lookupBindGroupOcc function was changed: it now takes NamespaceSpecifier
      and checks that the namespace of the found names matches the passed flag.
      With this change {-# WARNING data D "..." #-} pragma will only affect value
      namespace and {-# WARNING type D "..." #-} will only affect type
      namespace. The same logic is applicable to DEPRECATED pragmas.
      
      Finding duplicated warnings inside rnSrcWarnDecls now takes into
      consideration NamespaceSpecifier flag to allow warnings with the
      same names that refer to different namespaces.
      151dda4e
  4. Jan 10, 2024
  5. Dec 29, 2023
  6. Nov 09, 2023
  7. Aug 25, 2023
  8. Jul 25, 2023
    • Matthew Pickering's avatar
      Fix pretty printing of WARNING pragmas · 822ef66b
      Matthew Pickering authored and Marge Bot's avatar Marge Bot committed
      There is still something quite unsavoury going on with WARNING pragma
      printing because the printing relies on the fact that for decl
      deprecations the SourceText of WarningTxt is empty. However, I let that
      lion sleep and just fixed things directly.
      
      Fixes #23465
      822ef66b
  9. Jul 05, 2023
  10. Jun 14, 2023
  11. May 19, 2023
  12. May 16, 2023
  13. May 05, 2023
  14. Apr 30, 2023
  15. Apr 17, 2023
    • Matthew Pickering's avatar
      Account for special GHC.Prim import in warnUnusedPackages · 51479ceb
      Matthew Pickering authored and Marge Bot's avatar Marge Bot committed
      The GHC.Prim import is treated quite specially primarily because there
      isn't an interface file for GHC.Prim. Therefore we record separately in
      the ModSummary if it's imported or not so we don't go looking for it.
      
      This logic hasn't made it's way to `-Wunused-packages` so if you
      imported GHC.Prim then the warning would complain you didn't use
      `-package ghc-prim`.
      
      Fixes #23212
      51479ceb
  16. Mar 29, 2023
    • sheaf's avatar
      Handle records in the renamer · 3f374399
      sheaf authored
      This patch moves the field-based logic for disambiguating record updates
      to the renamer. The type-directed logic, scheduled for removal, remains
      in the typechecker.
      
      To do this properly (and fix the myriad of bugs surrounding the treatment
      of duplicate record fields), we took the following main steps:
      
        1. Create GREInfo, a renamer-level equivalent to TyThing which stores
           information pertinent to the renamer.
           This allows us to uniformly treat imported and local Names in the
           renamer, as described in Note [GREInfo].
      
        2. Remove GreName. Instead of a GlobalRdrElt storing GreNames, which
           distinguished between normal names and field names, we now store
           simple Names in GlobalRdrElt, along with the new GREInfo information
           which allows us to recover the FieldLabel for record fields.
      
        3. Add namespacing for record fields, within the OccNames themselves.
           This allows us to remove the mangling of duplicate field selectors.
      
           This change ensures we don't print mangled names to the user in
           error messages, and allows us to handle duplicate record fields
           in Template Haskell.
      
        4. Move record disambiguation to the renamer, and operate on the
           level of data constructors instead, to handle #21443.
      
           The error message text for ambiguous record updates has also been
           changed to reflect that type-directed disambiguation is on the way
           out.
      
      (3) means that OccEnv is now a bit more complex: we first key on the
      textual name, which gives an inner map keyed on NameSpace:
      
        OccEnv a ~ FastStringEnv (UniqFM NameSpace a)
      
      Note that this change, along with (2), both increase the memory residency
      of GlobalRdrEnv = OccEnv [GlobalRdrElt], which causes a few tests to
      regress somewhat in compile-time allocation.
      
      Even though (3) simplified a lot of code (in particular the treatment of
      field selectors within Template Haskell and in error messages), it came
      with one important wrinkle: in the situation of
      
        -- M.hs-boot
        module M where { data A; foo :: A -> Int }
        -- M.hs
        module M where { data A = MkA { foo :: Int } }
      
      we have that M.hs-boot exports a variable foo, which is supposed to match
      with the record field foo that M exports. To solve this issue, we add a
      new impedance-matching binding to M
      
        foo{var} = foo{fld}
      
      This mimics the logic that existed already for impedance-binding DFunIds,
      but getting it right was a bit tricky.
      See Note [Record field impedance matching] in GHC.Tc.Module.
      
      We also needed to be careful to avoid introducing space leaks in GHCi.
      So we dehydrate the GlobalRdrEnv before storing it anywhere, e.g. in
      ModIface. This means stubbing out all the GREInfo fields, with the
      function forceGlobalRdrEnv.
      When we read it back in, we rehydrate with rehydrateGlobalRdrEnv.
      This robustly avoids any space leaks caused by retaining old type
      environments.
      
      Fixes #13352 #14848 #17381 #17551 #19664 #21443 #21444 #21720 #21898 #21946 #21959 #22125 #22160 #23010 #23062 #23063
      
      Updates haddock submodule
      
      -------------------------
      Metric Increase:
          MultiComponentModules
          MultiLayerModules
          MultiLayerModulesDefsGhci
          MultiLayerModulesNoCode
          T13701
          T14697
          hard_hole_fits
      -------------------------
      3f374399
  17. Mar 24, 2023
    • Adam Gundry's avatar
      Allow WARNING pragmas to be controlled with custom categories · f932c589
      Adam Gundry authored and Marge Bot's avatar Marge Bot committed
      Closes #17209. This implements GHC Proposal 541, allowing a WARNING
      pragma to be annotated with a category like so:
      
          {-# WARNING in "x-partial" head "This function is undefined on empty lists." #-}
      
      The user can then enable, disable and set the severity of such warnings
      using command-line flags `-Wx-partial`, `-Werror=x-partial` and so on.  There
      is a new warning group `-Wextended-warnings` containing all these warnings.
      Warnings without a category are treated as if the category was `deprecations`,
      and are (still) controlled by the flags `-Wdeprecations`
      and `-Wwarnings-deprecations`.
      
      Updates Haddock submodule.
      f932c589
  18. Jan 28, 2023
    • Andrei Borzenkov's avatar
      Convert diagnostics in GHC.Rename.Bind to proper TcRnMessage (#20115) · 50b1e2e8
      Andrei Borzenkov authored and Marge Bot's avatar Marge Bot committed
      I removed all occurrences of TcRnUnknownMessage in GHC.Rename.Bind
      module. Instead, these TcRnMessage messages were introduced:
        TcRnMultipleFixityDecls
        TcRnIllegalPatternSynonymDecl
        TcRnIllegalClassBiding
        TcRnOrphanCompletePragma
        TcRnEmptyCase
        TcRnNonStdGuards
        TcRnDuplicateSigDecl
        TcRnMisplacedSigDecl
        TcRnUnexpectedDefaultSig
        TcRnBindInBootFile
        TcRnDuplicateMinimalSig
      50b1e2e8
    • Simon Peyton Jones's avatar
      Report family instance orphans correctly · 46a53bb2
      Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
      This fixes the fact that we were not reporting orphan family instances
      at all. The fix here is easy, but touches a bit of code. I refactored
      the code to be much more similar to the way that class instances are done:
      
         - Add a fi_orphan field to FamInst, like the is_orphan field in ClsInst
         - Make newFamInst initialise this field, just like newClsInst
         - And make newFamInst report a warning for an orphan, just like newClsInst
         - I moved newFamInst from GHC.Tc.Instance.Family to GHC.Tc.Utils.Instantiate,
           just like newClsInst.
         - I added mkLocalFamInst to FamInstEnv, just like mkLocalClsInst in InstEnv
         - TcRnOrphanInstance and SuggestFixOrphanInstance are now parametrised
           over class instances vs type/data family instances.
      
      Fixes #19773
      46a53bb2
  19. Jan 24, 2023
    • Matthew Pickering's avatar
      Improve driver diagnostic messages by including UnitId in message · 06cc0a95
      Matthew Pickering authored and Marge Bot's avatar Marge Bot committed
      Currently the driver diagnostics don't give any indication about which unit they correspond to.
      
      For example `-Wmissing-home-modules` can fire multiple times for each different home unit and gives no indication about which unit it's actually reporting about.
      
      Perhaps a longer term fix is to generalise the providence information away from a SrcSpan so that these kind of whole project errors can be reported with an accurate provenance. For now we can just include the `UnitId` in the error message.
      
      Fixes #22678
      06cc0a95
    • Matthew Pickering's avatar
      Augment target filepath by working directory when checking if module satisfies target · 7bfb30f9
      Matthew Pickering authored and Marge Bot's avatar Marge Bot committed
      This fixes a spurious warning in -Wmissing-home-modules.
      
      This is a simple oversight where when looking for the target in the
      first place we augment the search by the -working-directory flag but
      then fail to do so when checking this warning.
      
      Fixes #22676
      7bfb30f9
  20. Jan 19, 2023
  21. Jan 18, 2023
    • Adam Gundry's avatar
      Refactor warning flag parsing to add missing flags · d0a63ef8
      Adam Gundry authored and Marge Bot's avatar Marge Bot committed
      This adds `-Werror=<group>` and `-fwarn-<group>` flags for warning
      groups as well as individual warnings. Previously these were defined
      on an ad hoc basis so for example we had `-Werror=compat` but not
      `-Werror=unused-binds`, whereas we had `-fwarn-unused-binds` but not
      `-fwarn-compat`. Fixes #22182.
      d0a63ef8
    • Vladislav Zavialov's avatar
      Enable -Wstar-is-type by default (#22759) · e9c0537c
      Vladislav Zavialov authored and Marge Bot's avatar Marge Bot committed
      Following the plan in GHC Proposal #143 "Remove the * kind syntax",
      which states:
      
      	In the next release (or 3 years in), enable -fwarn-star-is-type by default.
      
      The "next release" happens to be 9.6.1
      
      I also moved the T21583 test case from should_fail to should_compile,
      because the only reason it was failing was -Werror=compat in our test
      suite configuration.
      e9c0537c
  22. Nov 09, 2022
    • Giles Anderson's avatar
      Use TcRnDiagnostic in GHC.Tc.TyCl.Instance (#20117) · 92ccb8de
      Giles Anderson authored and Marge Bot's avatar Marge Bot committed
      The following `TcRnDiagnostic` messages have been introduced:
      
      TcRnWarnUnsatisfiedMinimalDefinition
      TcRnMisplacedInstSig
      TcRnBadBootFamInstDeclErr
      TcRnIllegalFamilyInstance
      TcRnAssocInClassErr
      TcRnBadFamInstDecl
      TcRnNotOpenFamily
      92ccb8de
  23. Sep 13, 2022
    • sheaf's avatar
      Diagnostic codes: acccept test changes · 362cca13
      sheaf authored and Marge Bot's avatar Marge Bot committed
      The testsuite output now contains diagnostic codes, so many tests need
      to be updated at once.
      We decided it was best to keep the diagnostic codes in the testsuite
      output, so that contributors don't inadvertently make changes to the
      diagnostic codes.
      362cca13
  24. Jun 06, 2022
  25. Jun 01, 2022
  26. Apr 29, 2022
  27. Apr 28, 2022
  28. Apr 01, 2022
    • Matthew Pickering's avatar
      driver: Improve -Wunused-packages error message (and simplify implementation) · f8fc6d2e
      Matthew Pickering authored
      In the past I improved the part of -Wunused-packages which found which
      packages were used. Now I improve the part which detects which ones were
      specified. The key innovation is to use the explicitUnits field from
      UnitState which has the result of resolving the package flags, so we
      don't need to mess about with the flag arguments from DynFlags anymore.
      
      The output now always includes the package name and version (and the
      flag which exposed it).
      
      ```
          The following packages were specified via -package or -package-id flags,
          but were not needed for compilation:
            - bytestring-0.11.2.0 (exposed by flag -package bytestring)
            - ghc-9.3 (exposed by flag -package ghc)
            - process-1.6.13.2 (exposed by flag -package process)
      ```
      
      Fixes #21307
      f8fc6d2e
  29. Mar 23, 2022
    • Zubin's avatar
      hi haddock: Lex and store haddock docs in interface files · b91798be
      Zubin authored and Marge Bot's avatar Marge Bot committed
      Names appearing in Haddock docstrings are lexed and renamed like any other names
      appearing in the AST. We currently rename names irrespective of the namespace,
      so both type and constructor names corresponding to an identifier will appear in
      the docstring. Haddock will select a given name as the link destination based on
      its own heuristics.
      
      This patch also restricts the limitation of `-haddock` being incompatible with
      `Opt_KeepRawTokenStream`.
      
      The export and documenation structure is now computed in GHC and serialised in
      .hi files. This can be used by haddock to directly generate doc pages without
      reparsing or renaming the source. At the moment the operation of haddock
      is not modified, that's left to a future patch.
      
      Updates the haddock submodule with the minimum changes needed.
      b91798be
  30. Mar 15, 2022
    • Vladislav Zavialov's avatar
      Export (~) from Data.Type.Equality (#18862) · ab618309
      Vladislav Zavialov authored
      * Users can define their own (~) type operator
      * Haddock can display documentation for the built-in (~)
      * New transitional warnings implemented:
          -Wtype-equality-out-of-scope
          -Wtype-equality-requires-operators
      
      Updates the haddock submodule.
      ab618309
  31. Feb 20, 2022
    • sheaf's avatar
      Use diagnostics for "missing signature" errors · 92ab3ff2
      sheaf authored and Marge Bot's avatar Marge Bot committed
        This patch makes the "missing signature" errors from
        "GHC.Rename.Names" use the diagnostic infrastructure.
        This encompasses missing type signatures for top-level bindings
        and pattern synonyms, as well as missing kind signatures for
        type constructors.
      
        This patch also renames TcReportMsg to TcSolverReportMsg,
        and adds a few convenience functions to compute whether such a
        TcSolverReportMsg is an expected/actual message.
      92ab3ff2
  32. Dec 28, 2021
    • Matthew Pickering's avatar
      Multiple Home Units · fd42ab5f
      Matthew Pickering authored
      
      Multiple home units allows you to load different packages which may depend on
      each other into one GHC session. This will allow both GHCi and HLS to support
      multi component projects more naturally.
      
      Public Interface
      ~~~~~~~~~~~~~~~~
      
      In order to specify multiple units, the -unit @⟨filename⟩ flag
      is given multiple times with a response file containing the arguments for each unit.
      The response file contains a newline separated list of arguments.
      
      ```
      ghc -unit @unitLibCore -unit @unitLib
      ```
      
      where the `unitLibCore` response file contains the normal arguments that cabal would pass to `--make` mode.
      
      ```
      -this-unit-id lib-core-0.1.0.0
      -i
      -isrc
      LibCore.Utils
      LibCore.Types
      ```
      
      The response file for lib, can specify a dependency on lib-core, so then modules in lib can use modules from lib-core.
      
      ```
      -this-unit-id lib-0.1.0.0
      -package-id lib-core-0.1.0.0
      -i
      -isrc
      Lib.Parse
      Lib.Render
      ```
      
      Then when the compiler starts in --make mode it will compile both units lib and lib-core.
      
      There is also very basic support for multiple home units in GHCi, at the
      moment you can start a GHCi session with multiple units but only the
      :reload is supported. Most commands in GHCi assume a single home unit,
      and so it is additional work to work out how to modify the interface to
      support multiple loaded home units.
      
      Options used when working with Multiple Home Units
      
      There are a few extra flags which have been introduced specifically for
      working with multiple home units. The flags allow a home unit to pretend
      it’s more like an installed package, for example, specifying the package
      name, module visibility and reexported modules.
      
      -working-dir ⟨dir⟩
      
          It is common to assume that a package is compiled in the directory
          where its cabal file resides. Thus, all paths used in the compiler
          are assumed to be relative to this directory. When there are
          multiple home units the compiler is often not operating in the
          standard directory and instead where the cabal.project file is
          located. In this case the -working-dir option can be passed which
          specifies the path from the current directory to the directory the
          unit assumes to be it’s root, normally the directory which contains
          the cabal file.
      
          When the flag is passed, any relative paths used by the compiler are
          offset by the working directory. Notably this includes -i and
          -I⟨dir⟩ flags.
      
      -this-package-name ⟨name⟩
      
          This flag papers over the awkward interaction of the PackageImports
          and multiple home units. When using PackageImports you can specify
          the name of the package in an import to disambiguate between modules
          which appear in multiple packages with the same name.
      
          This flag allows a home unit to be given a package name so that you
          can also disambiguate between multiple home units which provide
          modules with the same name.
      
      -hidden-module ⟨module name⟩
      
          This flag can be supplied multiple times in order to specify which
          modules in a home unit should not be visible outside of the unit it
          belongs to.
      
          The main use of this flag is to be able to recreate the difference
          between an exposed and hidden module for installed packages.
      
      -reexported-module ⟨module name⟩
      
          This flag can be supplied multiple times in order to specify which
          modules are not defined in a unit but should be reexported. The
          effect is that other units will see this module as if it was defined
          in this unit.
      
          The use of this flag is to be able to replicate the reexported
          modules feature of packages with multiple home units.
      
      Offsetting Paths in Template Haskell splices
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      
      When using Template Haskell to embed files into your program,
      traditionally the paths have been interpreted relative to the directory
      where the .cabal file resides. This causes problems for multiple home
      units as we are compiling many different libraries at once which have
      .cabal files in different directories.
      
      For this purpose we have introduced a way to query the value of the
      -working-dir flag to the Template Haskell API. By using this function we
      can implement a makeRelativeToProject function which offsets a path
      which is relative to the original project root by the value of
      -working-dir.
      
      ```
      import Language.Haskell.TH.Syntax ( makeRelativeToProject )
      
      foo = $(makeRelativeToProject "./relative/path" >>= embedFile)
      ```
      
      > If you write a relative path in a Template Haskell splice you should use the makeRelativeToProject function so that your library works correctly with multiple home units.
      
      A similar function already exists in the file-embed library. The
      function in template-haskell implements this function in a more robust
      manner by honouring the -working-dir flag rather than searching the file
      system.
      
      Closure Property for Home Units
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      
      For tools or libraries using the API there is one very important closure
      property which must be adhered to:
      
      > Any dependency which is not a home unit must not (transitively) depend
        on a home unit.
      
      For example, if you have three packages p, q and r, then if p depends on
      q which depends on r then it is illegal to load both p and r as home
      units but not q, because q is a dependency of the home unit p which
      depends on another home unit r.
      
      If you are using GHC by the command line then this property is checked,
      but if you are using the API then you need to check this property
      yourself. If you get it wrong you will probably get some very confusing
      errors about overlapping instances.
      
      Limitations of Multiple Home Units
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      
      There are a few limitations of the initial implementation which will be smoothed out on user demand.
      
          * Package thinning/renaming syntax is not supported
          * More complicated reexports/renaming are not yet supported.
          * It’s more common to run into existing linker bugs when loading a
            large number of packages in a session (for example #20674, #20689)
          * Backpack is not yet supported when using multiple home units.
          * Dependency chasing can be quite slow with a large number of
            modules and packages.
          * Loading wired-in packages as home units is currently not supported
            (this only really affects GHC developers attempting to load
            template-haskell).
          * Barely any normal GHCi features are supported, it would be good to
            support enough for ghcid to work correctly.
      
      Despite these limitations, the implementation works already for nearly
      all packages. It has been testing on large dependency closures,
      including the whole of head.hackage which is a total of 4784 modules
      from 452 packages.
      
      Internal Changes
      ~~~~~~~~~~~~~~~~
      
      * The biggest change is that the HomePackageTable is replaced with the
        HomeUnitGraph. The HomeUnitGraph is a map from UnitId to HomeUnitEnv,
        which contains information specific to each home unit.
      * The HomeUnitEnv contains:
          - A unit state, each home unit can have different package db flags
          - A set of dynflags, each home unit can have different flags
          - A HomePackageTable
      * LinkNode: A new node type is added to the ModuleGraph, this is used to
        place the linking step into the build plan so linking can proceed in
        parralel with other packages being built.
      * New invariant: Dependencies of a ModuleGraphNode can be completely
        determined by looking at the value of the node. In order to achieve
        this, downsweep now performs a more complete job of downsweeping and
        then the dependenices are recorded forever in the node rather than
        being computed again from the ModSummary.
      * Some transitive module calculations are rewritten to use the
        ModuleGraph which is more efficient.
      * There is always an active home unit, which simplifies modifying a lot
        of the existing API code which is unit agnostic (for example, in the
        driver).
      
      The road may be bumpy for a little while after this change but the
      basics are well-tested.
      
      One small metric increase, which we accept and also submodule update to
      haddock which removes ExtendedModSummary.
      
      Closes #10827
      
      -------------------------
      Metric Increase:
          MultiLayerModules
      -------------------------
      
      Co-authored-by: default avatarFendor <power.walross@gmail.com>
      fd42ab5f
  33. Oct 26, 2021
  34. Oct 08, 2021
    • abarbu's avatar
      Add defaulting plugins. · a76409c7
      abarbu authored
      Like the built-in type defaulting rules these plugins can propose candidates
      to resolve ambiguous type variables.
      
      Machine learning and other large APIs like those for game engines introduce
      new numeric types and other complex typed APIs. The built-in defaulting
      mechanism isn't powerful enough to resolve ambiguous types in these cases forcing
      users to specify minutia that they might not even know how to do. There is
      an example defaulting plugin linked in the documentation. Applications include
      defaulting the device a computation executes on, if a gradient should be
      computed for a tensor, or the size of a tensor.
      
      See https://github.com/ghc-proposals/ghc-proposals/pull/396 for details.
      a76409c7
  35. Oct 05, 2021
    • Alfredo Di Napoli's avatar
      Eradicate TcRnUnknownMessage from GHC.Tc.Deriv · ac275f42
      Alfredo Di Napoli authored and Marge Bot's avatar Marge Bot committed
      This (big) commit finishes porting the GHC.Tc.Deriv module to support
      the new diagnostic infrastructure (#18516) by getting rid of the legacy
      calls to `TcRnUnknownMessage`. This work ended up being quite pervasive
      and touched not only the Tc.Deriv module but also the Tc.Deriv.Utils and
      Tc.Deriv.Generics module, which needed to be adapted to use the new
      infrastructure. This also required generalising `Validity`.
      
      More specifically, this is a breakdown of the work done:
      
      * Add and use the TcRnUselessTypeable data constructor
      * Add and use TcRnDerivingDefaults data constructor
      * Add and use the TcRnNonUnaryTypeclassConstraint data constructor
      * Add and use TcRnPartialTypeSignatures
      * Add T13324_compile2 test to test another part of the
        TcRnPartialTypeSignatures diagnostic
      * Add and use TcRnCannotDeriveInstance data constructor, which introduces a
        new data constructor to TcRnMessage called TcRnCannotDeriveInstance, which
        is further sub-divided to carry a `DeriveInstanceErrReason` which explains
        the reason why we couldn't derive a typeclass instance.
      * Add DerivErrSafeHaskellGenericInst data constructor to DeriveInstanceErrReason
      * Add DerivErrDerivingViaWrongKind and DerivErrNoEtaReduce
      * Introduce the SuggestExtensionInOrderTo Hint, which adds (and use) a new
        constructor to the hint type `LanguageExtensionHint` called `SuggestExtensionInOrderTo`,
        which can be used to give a bit more "firm" recommendations when it's
        obvious what the required extension is, like in the case for the
        `DerivingStrategies`, which automatically follows from having enabled
        both `DeriveAnyClass` and `GeneralizedNewtypeDeriving`.
      * Wildcard-free pattern matching in mk_eqn_stock, which removes `_` in
        favour of pattern matching explicitly on `CanDeriveAnyClass` and
        `NonDerivableClass`, because that determine whether or not we can
        suggest to the user `DeriveAnyClass` or not.
      ac275f42
  36. Sep 07, 2021
    • Alfredo Di Napoli's avatar
      Add and use new constructors to TcRnMessage · 7fa8c32c
      Alfredo Di Napoli authored and Marge Bot's avatar Marge Bot committed
      This commit adds the following constructors to the TcRnMessage type and
      uses them to replace sdoc-based diagnostics in some parts of GHC (e.g.
      TcRnUnknownMessage). It includes:
      
      * Add TcRnMonomorphicBindings diagnostic
      * Convert TcRnUnknownMessage in Tc.Solver.Interact
      * Add and use the TcRnOrphanInstance constructor to TcRnMessage
      * Add TcRnFunDepConflict and TcRnDupInstanceDecls constructors to TcRnMessage
      * Add and use TcRnConflictingFamInstDecls constructor to TcRnMessage
      * Get rid of TcRnUnknownMessage from GHC.Tc.Instance.Family
      7fa8c32c
  37. Aug 24, 2021
Loading