r191484 - Sema: Respect -fdelayed-template-parsing when parsing constexpr functions
David Majnemer
david.majnemer at gmail.com
Wed Oct 23 14:36:09 PDT 2013
On Wed, Oct 23, 2013 at 10:43 AM, Richard Smith <richard at metafoo.co.uk>wrote:
> On Thu, Sep 26, 2013 at 9:14 PM, David Majnemer <david.majnemer at gmail.com>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).
>
Good call, I've implemented this approach in r193274.
>
>
>> 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
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131023/aef4e4f8/attachment.html>
More information about the cfe-commits
mailing list