[PATCH] D16989: Change interpretation of function definition in friend declaration of template class.
Serge Pavlov via cfe-commits
cfe-commits at lists.llvm.org
Tue May 3 09:40:30 PDT 2016
2016-04-26 0:55 GMT+06:00 Richard Smith <richard at metafoo.co.uk>:
> rsmith added inline comments.
>
> ================
> Comment at: lib/Sema/SemaDecl.cpp:8611-8612
> @@ -8609,3 +8610,4 @@
> } else {
> - // This needs to happen first so that 'inline' propagates.
> - NewFD->setPreviousDeclaration(cast<FunctionDecl>(OldDecl));
> + if (NewFD->isOutOfLine() &&
> + NewFD->getLexicalDeclContext()->isDependentContext() &&
> + IsDefinition)
> ----------------
> Please factor this check out into a suitably-named function,
> `shouldLinkDependentDeclWithPrevious` or similar, and pass in `OldDecl` as
> well. I imagine we'll want to call this from multiple places (for instance,
> when handling `VarDecl`s), and I can see a few ways of making it return
> `true` in more cases, which would allow us to provide more precise
> diagnostics in a few more cases.
>
> (For instance, if the old and new declarations are in the same lexical
> context, we can mark them as redeclarations, and more generally I think we
> can do so if the new declaration has no more template parameters in scope
> than the old one did and the old declaration is declared within the current
> instantiation of the new declaration).
>
>
Done. The content of `shouldLinkDependentDeclWithPrevious` now supports
only the case of friend functions, more elaborated implementation will be
made latter in separate changes.
> ================
> Comment at: lib/Sema/SemaDecl.cpp:8613
> @@ +8612,3 @@
> + NewFD->getLexicalDeclContext()->isDependentContext() &&
> + IsDefinition)
> + // Do not put friend function definitions found in template
> classes to
> ----------------
> I don't think it makes sense to check whether the template declaration is
> a definition. It should not be added to the redeclaration chain regardless
> of whether it's a definition.
>
Indeed, without tracking of whether the declaration is a definition, the
implementation becomes simpler.
> ================
> Comment at: lib/Sema/SemaDecl.cpp:10951-10956
> @@ -10941,1 +10950,8 @@
> SkipBodyInfo *SkipBody) {
> + // Don't complain if the given declaration corresponds to the friend
> function
> + // declared in a template class. Such declaration defines the function
> only if
> + // the template is instantiated, in the latter case the definition must
> be
> + // found in corresponding class instantiation.
> + if (FD->isOutOfLine() &&
> FD->getLexicalDeclContext()->isDependentContext())
> + return;
> +
> ----------------
> Is this change necessary? If we're not putting dependent templates into
> redeclaration chains any more, we shouldn't find an existing definition ...
>
Removed.
>
> ================
> Comment at: lib/Sema/SemaDecl.cpp:10962
> @@ -10945,3 +10961,3 @@
> if (!Definition)
> if (!FD->isDefined(Definition))
> return;
> ----------------
> ... down here.
>
> ================
> Comment at: lib/Sema/SemaDeclCXX.cpp:12663-12673
> @@ -12662,1 +12662,13 @@
>
> + // If a friend non-dependent function is declared in a dependent
> context, do
> + // not put it into redeclaration chain of corresponding file level
> + // declarations. Such function will be available when the template will
> be
> + // instantiated.
> + } else if (CurContext->isDependentContext() &&
> + (D.getName().getKind() != UnqualifiedId::IK_TemplateId) &&
> + (SS.isInvalid() || !SS.isSet())) {
> + DC = CurContext;
> + while (!DC->isFileContext())
> + DC = DC->getParent();
> + LookupName(Previous, S);
> +
> ----------------
> What do these changes have to do with avoiding putting the declaration
> into the redeclaration chain? This looks equivalent to what the following
> `if` block will do, except that (a) it uses `LookupName` instead of
> `LookupQualifiedName` (which might be a bug fix but doesn't seem related to
> whether the context was dependent), and (b) it forgets to set `DCScope`
> (which looks like a bug).
>
>
Removed. All job now is done by `shouldLinkDependentDeclWithPrevious`.
http://reviews.llvm.org/D16989
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160503/5b813407/attachment.html>
More information about the cfe-commits
mailing list