On Thu, Sep 26, 2013 at 9:14 PM, David Majnemer <[email protected]>wrote:
> Author: majnemer > Date: Thu Sep 26 23:14:12 2013 > New Revision: 191484 > > URL: http://llvm.org/viewvc/llvm-project?rev=191484&view=rev > Log: > Sema: Respect -fdelayed-template-parsing when parsing constexpr functions > > Functions declared as constexpr must have their parsing delayed in > -fdelayed-template-parsing mode so as not to upset later template > instantiation. > I don't think this is the best fix. We should ignore -fdelayed-template-parsing for constexpr functions, and instead parse them eagerly. We don't need to delay here, because there's no existing code which contains a function which is marked constexpr and relies on MSVC brokenness. With this fix, constexpr function templates are basically not usable in constant expressions with -fdelayed-template-parsing (because their bodies are not available). > N.B. My reading of the standard makes it seem like delayed template > parsing is at odds with constexpr. We may want to make refinements in > other places in clang to make constexpr play nicer with this feature. > > This fixes PR17334. > > Modified: > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/test/Parser/DelayedTemplateParsing.cpp > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=191484&r1=191483&r2=191484&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Sep 26 23:14:12 2013 > @@ -11010,7 +11010,8 @@ void Sema::MarkFunctionReferenced(Source > // However, they cannot be referenced if they are deleted, and they > are > // deleted whenever the implicit definition of the special member > would > // fail. > - if (!Func->isConstexpr() || Func->getBody()) > + if (!(Func->isConstexpr() && !getLangOpts().DelayedTemplateParsing) || > + Func->getBody()) > return; > CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Func); > if (!Func->isImplicitlyInstantiable() && (!MD || > MD->isUserProvided())) > @@ -11101,13 +11102,14 @@ void Sema::MarkFunctionReferenced(Source > } > } > > - if (!AlreadyInstantiated || Func->isConstexpr()) { > + if (!AlreadyInstantiated || > + (Func->isConstexpr() && !getLangOpts().DelayedTemplateParsing)) { > if (isa<CXXRecordDecl>(Func->getDeclContext()) && > cast<CXXRecordDecl>(Func->getDeclContext())->isLocalClass() && > ActiveTemplateInstantiations.size()) > PendingLocalImplicitInstantiations.push_back( > std::make_pair(Func, PointOfInstantiation)); > - else if (Func->isConstexpr()) > + else if (Func->isConstexpr() && > !getLangOpts().DelayedTemplateParsing) > // Do not defer instantiations of constexpr functions, to avoid > the > // expression evaluator needing to call back into Sema if it sees > a > // call to such a function. > > Modified: cfe/trunk/test/Parser/DelayedTemplateParsing.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/DelayedTemplateParsing.cpp?rev=191484&r1=191483&r2=191484&view=diff > > ============================================================================== > --- cfe/trunk/test/Parser/DelayedTemplateParsing.cpp (original) > +++ cfe/trunk/test/Parser/DelayedTemplateParsing.cpp Thu Sep 26 23:14:12 > 2013 > @@ -102,3 +102,15 @@ namespace rdar11700604 { > }; > } > > +namespace PR17334 { > + > +template <typename = void> struct ArrayRef { > + constexpr ArrayRef() {} > +}; > +template <typename = void> void CreateConstInBoundsGEP2_32() { > + ArrayRef<> IdxList; > +} > +void LLVMBuildStructGEP() { CreateConstInBoundsGEP2_32(); } > + > +} > + > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
