rsmith added a comment.

Please take a look at 
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0588r1.html, which 
respecifies the rules for lambda capture and its interaction with default 
arguments, and has been voted into the C++ working paper as a defect report 
resolution. The approach there is to use a purely syntactic, scope-based 
mechanism to detect problems such as this. (In dependent contexts, we can track 
on the `DeclRefExpr` whether the name is odr-usable, in case we can't tell 
whether it's odr-used from the template definition alone.)



================
Comment at: include/clang/Sema/Sema.h:1062
+
+  const DeclContext *ParentOfDefaultArg = nullptr;
+
----------------
There are lots of cases where we switch context in the middle of handling an 
expression, for instance to instantiate a template (or even *parse* a template 
in MSVC-compatible delayed template parsing mode). It's not reasonable to add a 
new form of state that all those places will need to save and restore 
themselves.

Please consider whether this would make sense as a member of the 
`ExpressionEvaluationContextRecord` or similar.


================
Comment at: lib/Sema/SemaExpr.cpp:4520-4541
+      // Add mappings for instantiated parameters appearing before Param. This
+      // is needed to instantiate default argument expressions referencing
+      // other parameters in unevaluated contexts.
+      if (FunctionDecl *Pattern = FD->getTemplateInstantiationPattern()) {
+        auto I = FD->param_begin();
+        for (const auto *PVD : Pattern->parameters()) {
+          if (*I == Param)
----------------
Use `addInstantiatedParametersToScope` for this.

This bugfix looks to be independent of the fix for lambdas; can you factor it 
out into a separate patch?


https://reviews.llvm.org/D36915



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to