================
@@ -488,6 +490,20 @@ bool Sema::MergeCXXFunctionDecl(FunctionDecl *New, 
FunctionDecl *Old,
       continue;
     }
 
+    if (PrevForDefaultArgs->getLexicalDeclContext()->getPrimaryContext() !=
+            ScopeDC->getPrimaryContext() &&
+        !New->isCXXClassMember())
+      // If previous declaration is lexically in a different scope,
+      // we don't inherit its default arguments, except for out-of-line
+      // declarations of member functions.
+      //
+      // extern "C" and local functions can have default arguments across
+      // different scopes, but diagnosing that early would reject well-formed
+      // code (_N5001_.[over.match.best]/4.) Instead, they are checked
+      // in ConvertArgumentsForCall, after the best viable function has been
+      // selected.
+      continue;
+
----------------
Endilll wrote:

> Move the comment immediately above the if

I'm keeping this consistent with the surrounding code.

> we usually quote C++2c rather than a specific draft

Hmm, fine.

> but i think the wording we want to quote here is actually
https://eel.is/c++draft/dcl.fct.default#4.sentence-2

No, the wording that you point at (together with the ODR) is what allows 
`MergeCXXFunctionDecl` to diagnose redeclarations of default arguments in the 
same scope early, during declaration matching.

The wording I'm pointing at explains why we need to defer check for default 
arguments defined in different scopes.

> do we have tests for that?

Yes, `l3` in `default-arguments-different-scopes.cpp`.

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

Reply via email to