================
@@ -5052,6 +5052,21 @@ void Sema::InstantiateFunctionDefinition(SourceLocation 
PointOfInstantiation,
   Function->setInnerLocStart(PatternDecl->getInnerLocStart());
   Function->setRangeEnd(PatternDecl->getEndLoc());
 
+  // Propagate '__restrict' properly.
+  if (auto MD = dyn_cast<CXXMethodDecl>(Function)) {
+    bool Restrict = cast<CXXMethodDecl>(PatternDecl)->isEffectivelyRestrict();
+    if (Restrict != MD->getMethodQualifiers().hasRestrict()) {
+      const auto *FPT = MD->getType()->getAs<FunctionProtoType>();
+      FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
+      if (Restrict)
+        EPI.TypeQuals.addRestrict();
+      else
+        EPI.TypeQuals.removeRestrict();
+      MD->setType(Context.getFunctionType(FPT->getReturnType(),
+                                          FPT->getParamTypes(), EPI));
+    }
+  }
+
----------------
Sirraide wrote:

Actually, I think that’s not it. I got confused by this too just now: this here 
is about propagating `__restrict`-ness (or lack thereof since we may have to 
remove it again if the declaration is `__restrict`, but the definition isn’t, 
and we’re in GCC mode) to the definition of the function only.

Specifically, we can’t just make the declaration `__restrict` when we first 
create it; the declaration needs to be `__restrict` iff the template 
declaration is `__restrict`, and the definition needs to be `__restrict` iff 
the template defintion is `__restrict`; the former should happen automatically 
as part of template instantiation; this here is only about the latter.

I’m going to expand this comment a bit more to elaborate on this.

https://github.com/llvm/llvm-project/pull/83855
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to