[clang] [clang][ASTImporter] Fix import of template parameter default values. (PR #100100)

DonĂ¡t Nagy via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 23 07:49:15 PDT 2024


================
@@ -359,6 +359,31 @@ namespace clang {
           Params, Importer.getToContext().getTranslationUnitDecl());
     }
 
+    template <typename TemplateParmDeclT>
+    void tryUpdateTemplateParmDeclInheritedFrom(NamedDecl *RecentParm,
+                                                NamedDecl *NewParm) {
+      if (auto *ParmT = dyn_cast<TemplateParmDeclT>(RecentParm)) {
+        if (ParmT->hasDefaultArgument()) {
+          auto *P = cast<TemplateParmDeclT>(NewParm);
+          P->removeDefaultArgument();
+          P->setInheritedDefaultArgument(Importer.ToContext, ParmT);
+        }
+      }
+    }
+
+    void updateTemplateParametersInheritedFrom(
----------------
NagyDonat wrote:

```suggestion
  /// Update the parameter list `NewParams` of a template declaration by
  /// "inheriting" default argument values from `RecentParams`, which is
  /// the parameter list of an earlier declaration of the same template.
  /// (Note that "inheriting" default argument values this way is
  /// completely unrelated to the usual object-oriented "inheritance"
  /// relationship between classes.)
  ///
  /// Note that the standard specifies that the same parameter cannot be
  /// given default arguments twice in the same scope; but in our case
  /// the parameter list `NewParams` is freshly imported from a
  /// different TU, so it's possible that both `RecentParams` and
  /// `NewParams` specify a default argument for the same parameter.
  /// In this case, the code will use the default argument taken from
  /// `RecentParams`.
  /// FIXME: Report an error if the two default arguments are different.
    void updateTemplateParametersInheritedFrom(
```
I felt that it is important to explain that the "Inherited" within the name of this function is unrelated to the usual object-oriented "inheritance" between classes; and as I started to write this comment, I also ended up documenting the goals of this function. (I hope that I was correct -- please fix this comment block if I misunderstood something!) 

https://github.com/llvm/llvm-project/pull/100100


More information about the cfe-commits mailing list