================ @@ -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