r253495 - [Sema] Don't work around a malformed AST

Vassil Vassilev via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 10 01:03:31 PST 2017


On 18/11/15 20:49, David Majnemer via cfe-commits wrote:
> Author: majnemer
> Date: Wed Nov 18 13:49:19 2015
> New Revision: 253495
>
> URL: http://llvm.org/viewvc/llvm-project?rev=253495&view=rev
> Log:
> [Sema] Don't work around a malformed AST
>
> We created a malformed TemplateSpecializationType: it was dependent but
> had a RecordType as it's canonical type.  This would lead getAs to
> crash.  r249090 worked around this but we should fix this for real by
> providing a more appropriate template specialization type as the
> canonical type.
>
> This fixes PR24246.
>
> Modified:
>      cfe/trunk/lib/Sema/SemaLookup.cpp
>      cfe/trunk/lib/Sema/SemaTemplate.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=253495&r1=253494&r2=253495&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaLookup.cpp Wed Nov 18 13:49:19 2015
> @@ -3890,8 +3890,6 @@ void TypoCorrectionConsumer::addNamespac
>     auto &Types = SemaRef.getASTContext().getTypes();
>     for (unsigned I = 0; I != Types.size(); ++I) {
>       const auto *TI = Types[I];
> -    if (!TI->isClassType() && isa<TemplateSpecializationType>(TI))
> -      continue;
>       if (CXXRecordDecl *CD = TI->getAsCXXRecordDecl()) {
>         CD = CD->getCanonicalDecl();
>         if (!CD->isDependentType() && !CD->isAnonymousStructOrUnion() &&
>
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=253495&r1=253494&r2=253495&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Nov 18 13:49:19 2015
> @@ -6408,7 +6408,17 @@ Sema::ActOnClassTemplateSpecialization(S
>       if (!PrevDecl)
>         ClassTemplate->AddSpecialization(Specialization, InsertPos);
>   
> -    CanonType = Context.getTypeDeclType(Specialization);
> +    if (CurContext->isDependentContext()) {
> +      // -fms-extensions permits specialization of nested classes without
> +      // fully specializing the outer class(es).
> +      assert(getLangOpts().MicrosoftExt &&
> +             "Only possible with -fms-extensions!");
> +      TemplateName CanonTemplate = Context.getCanonicalTemplateName(Name);
> +      CanonType = Context.getTemplateSpecializationType(
Out of curiosity, could we use getCanonicalTemplateSpecializationType 
here and produce one less type?
> +          CanonTemplate, Converted.data(), Converted.size());
> +    } else {
> +      CanonType = Context.getTypeDeclType(Specialization);
> +    }
>     }
>   
>     // C++ [temp.expl.spec]p6:
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list