[PATCH] D11194: Instantiate function declarations in instantiated functions.
Serge Pavlov via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 18 10:05:13 PDT 2015
sepavloff added inline comments.
================
Comment at: lib/AST/DeclBase.cpp:273
@@ +272,3 @@
+ return true;
+ if (const CXXRecordDecl *ClassD = dyn_cast<CXXRecordDecl>(LDC))
+ return ClassD->isLocalClass() && !ClassD->isLambda();;
----------------
rsmith wrote:
> It's not necessary for this change, but to match its documentation this function should handle other kinds of `TagDecl` too (enums, C structs). Something like:
>
> do {
> if (LDC->isFunctionOrMethod())
> return true;
> if (!isa<TagDecl>(LDC))
> return false;
> LDC = LDC->getLexicalParent();
> } while (LDC);
> return false;
>
> ... maybe?
The proposed code recognizes lambda as lexically contained within a function. As a result, the following test starts to fail (obtained from CXX\expr\expr.prim\expr.prim.lambda\default-arguments.cpp):
```
struct NoDefaultCtor {
NoDefaultCtor(const NoDefaultCtor&); // expected-note{{candidate constructor}}
~NoDefaultCtor();
};
template<typename T>
void defargs_in_template_unused(T t) {
auto l1 = [](const T& value = T()) { };
l1(t);
}
template void defargs_in_template_unused(NoDefaultCtor);
```
because default value for lambda argument cannot be instantiated. It is not clear whether instantiation of the lambda default argument must always occur similar to DR1484. I couldn't find appropriate place in the standard. According to spirit it shouldn't as lambda is not a separate declaration but a part of instantiated content. If so 14.6.4.1p2 is more likely to be applied and the above test must pass.
Maybe we need to rename `isLexicallyWithinFunctionOrMethod` to `shouldBeAlwaysInstantiated` or something like that to avoid misunderstanding?
http://reviews.llvm.org/D11194
More information about the cfe-commits
mailing list