]> granicus.if.org Git - clang/commitdiff
[Sema] Don't work around a malformed AST
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 18 Nov 2015 19:49:19 +0000 (19:49 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 18 Nov 2015 19:49:19 +0000 (19:49 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@253495 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaLookup.cpp
lib/Sema/SemaTemplate.cpp

index 3f36caa84bb52c8c020a4929f116c236b17ae270..1124d989c7e86fd2c8960a881975465de8508878 100644 (file)
@@ -3890,8 +3890,6 @@ void TypoCorrectionConsumer::addNamespaces(
   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() &&
index 8821088baac17f70267a77d6f4faf8452d1297d4..c4c281488344a0c8a0cc3bfcbad85231ad613293 100644 (file)
@@ -6408,7 +6408,17 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec,
     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(
+          CanonTemplate, Converted.data(), Converted.size());
+    } else {
+      CanonType = Context.getTypeDeclType(Specialization);
+    }
   }
 
   // C++ [temp.expl.spec]p6: