]> granicus.if.org Git - clang/commitdiff
Merging r310158:
authorHans Wennborg <hans@hanshq.net>
Mon, 7 Aug 2017 20:45:55 +0000 (20:45 +0000)
committerHans Wennborg <hans@hanshq.net>
Mon, 7 Aug 2017 20:45:55 +0000 (20:45 +0000)
------------------------------------------------------------------------
r310158 | rtrieu | 2017-08-04 17:54:19 -0700 (Fri, 04 Aug 2017) | 8 lines

[ODRHash] Treat some non-templated classes as templated.

When using nested classes, if the inner class is not templated, but the outer
class is templated, the inner class will not be templated, but may have some
traits as if it were.  This is particularly evident if the inner class
refers to the outer class in some fashion.  Treat any class that is in the
context of a templated class as also a templated class.

------------------------------------------------------------------------

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

lib/AST/ODRHash.cpp

index b19135384cfd67c4c871057b7f458ba6e969fa70..121724a731526ec993d76dc1d39f083f86934c2f 100644 (file)
@@ -378,8 +378,12 @@ void ODRHash::AddCXXRecordDecl(const CXXRecordDecl *Record) {
   assert(Record && Record->hasDefinition() &&
          "Expected non-null record to be a definition.");
 
-  if (isa<ClassTemplateSpecializationDecl>(Record)) {
-    return;
+  const DeclContext *DC = Record;
+  while (DC) {
+    if (isa<ClassTemplateSpecializationDecl>(DC)) {
+      return;
+    }
+    DC = DC->getParent();
   }
 
   AddDecl(Record);