nomanous added inline comments.
================ Comment at: clang/lib/Sema/SemaTemplate.cpp:10117 + TSK == TSK_ExplicitInstantiationDefinition && Prev && + !Context.hasSameTypeIgnoreLifetime(Prev->getType(), R)) { + Diag(T->getTypeLoc().getBeginLoc(), ---------------- nomanous wrote: > rsmith wrote: > > Please can you point us at an example that needs this "ignore lifetime" > > nuance? We should check with Apple folks what they want to happen here, and > > we should presumably have the same rule for all explicit instantiations of > > templated variables -- both in the static data member case here and the > > variable template case a few lines above. > > > > My expectation is that we want one of these two rules: > > 1) the declared lifetime should match exactly between the declaration and > > the explicit instantiation, or > > 2) there cannot be a declared lifetime on the explicit instantiation, and a > > lifetime on the template declaration is ignored by the check > > (or a combination of these rules where we accept either option). I don't > > think that matches what you're doing here -- in particular, I think a wrong > > declared lifetime on the explicit instantiation should result in an error. > I'll do some test and give you a code snippet to trigger the lifetime > mismatch when lifetime specifiers are not ignored. With lifetime specifiers not ignored, use command ``` clang -cc1 -fobjc-arc -fblocks -fsyntax-only snippet.mm ``` to compile the obj-c++ file `snippet.mm` whose contents are as follows: ``` typedef void (^fptr)(); template<typename T> struct StaticMembers { static fptr f; }; template<typename T> fptr StaticMembers<T>::f = [] {}; template fptr StaticMembers<float>::f; ``` The compiler will give a type mismatch error, saying that `f`'s definition in the template class has a type `'__strong fptr' (aka 'void (^__strong)()')` while its explicit instantiation has a type `'fptr' (aka 'void (^)()')`, though they should essentially have the same type. This problem only happens in explicit instantiation of a static member of block type and doesn't affect static members of other types. @rsmith Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D90448/new/ https://reviews.llvm.org/D90448 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits