]> granicus.if.org Git - clang/commitdiff
Be a bit more careful with undefined CXXRecordDecls. Fixes
authorDouglas Gregor <dgregor@apple.com>
Thu, 1 Jul 2010 00:21:21 +0000 (00:21 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 1 Jul 2010 00:21:21 +0000 (00:21 +0000)
rdar://problem/8124080 and PR7118.

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

lib/Sema/JumpDiagnostics.cpp
lib/Sema/SemaLookup.cpp
test/SemaCXX/crash-8124080.cpp [new file with mode: 0644]

index 47dfbfbdc8a7e8baf9e6b9aacf606ff0c0feee3e..3431ac611886e6df692cbfd1748e60466b9898d1 100644 (file)
@@ -131,11 +131,13 @@ static std::pair<unsigned,unsigned>
         InDiag = diag::note_protected_by_variable_init;
 
       CanQualType T = VD->getType()->getCanonicalTypeUnqualified();
-      while (CanQual<ArrayType> AT = T->getAs<ArrayType>())
-        T = AT->getElementType();
-      if (CanQual<RecordType> RT = T->getAs<RecordType>())
-        if (!cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor())
-          OutDiag = diag::note_exits_dtor;
+      if (!T->isDependentType()) {
+        while (CanQual<ArrayType> AT = T->getAs<ArrayType>())
+          T = AT->getElementType();
+        if (CanQual<RecordType> RT = T->getAs<RecordType>())
+          if (!cast<CXXRecordDecl>(RT->getDecl())->hasTrivialDestructor())
+            OutDiag = diag::note_exits_dtor;
+      }
     }
     
     return std::make_pair(InDiag, OutDiag);    
index 906bce2fe3473b248a392e88e8790d1553ffd36e..4337e906fe4fe4a82e90b7c72d8544f7e41f407d 100644 (file)
@@ -1127,7 +1127,7 @@ bool Sema::LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
   // If this isn't a C++ class, we aren't allowed to look into base
   // classes, we're done.
   CXXRecordDecl *LookupRec = dyn_cast<CXXRecordDecl>(LookupCtx);
-  if (!LookupRec)
+  if (!LookupRec || !LookupRec->getDefinition())
     return false;
 
   // If we're performing qualified name lookup into a dependent class,
diff --git a/test/SemaCXX/crash-8124080.cpp b/test/SemaCXX/crash-8124080.cpp
new file mode 100644 (file)
index 0000000..78a0315
--- /dev/null
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// <rdar://problem/8124080>
+template<typename _Alloc> class allocator;
+template<class _CharT> struct char_traits;
+template<typename _CharT, typename _Traits = char_traits<_CharT>,            
+         typename _Alloc = allocator<_CharT> >
+class basic_string;
+template<typename _CharT, typename _Traits, typename _Alloc>
+const typename basic_string<_CharT, _Traits, _Alloc>::size_type   
+basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_max_size // expected-error{{no member named '_Rep' in 'basic_string<_CharT, _Traits, _Alloc>'}}
+  = (((npos - sizeof(_Rep_base))/sizeof(_CharT)) - 1) / 4; 
+
+// PR7118
+template<typename T>
+class Foo {
+  class Bar;
+  void f() {
+    Bar i;
+  }
+};