Make getDefinitiveDeclContext() actually return a DeclContext, as one
authorDouglas Gregor <dgregor@apple.com>
Tue, 22 Jan 2013 17:08:30 +0000 (17:08 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 22 Jan 2013 17:08:30 +0000 (17:08 +0000)
would expect, and clean up the return/break inconsistencies. Thanks,
Sebastian!

llvm-svn: 173171

clang/lib/Serialization/ASTCommon.cpp
clang/lib/Serialization/ASTCommon.h
clang/lib/Serialization/ASTReader.cpp

index 6ac4a26..955dc96 100644 (file)
@@ -87,7 +87,8 @@ unsigned serialization::ComputeHash(Selector Sel) {
   return R;
 }
 
-const Decl *serialization::getDefinitiveDeclContext(const DeclContext *DC) {
+const DeclContext *
+serialization::getDefinitiveDeclContext(const DeclContext *DC) {
   switch (DC->getDeclKind()) {
   // These entities may have multiple definitions.
   case Decl::TranslationUnit:
@@ -100,7 +101,7 @@ const Decl *serialization::getDefinitiveDeclContext(const DeclContext *DC) {
   case Decl::Record:
     if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition())
       return Def;
-    break;
+    return 0;
 
   // FIXME: These can be defined in one place... except special member
   // functions and out-of-line definitions.
@@ -122,25 +123,25 @@ const Decl *serialization::getDefinitiveDeclContext(const DeclContext *DC) {
   case Decl::ObjCCategory:
   case Decl::ObjCCategoryImpl:
   case Decl::ObjCImplementation:
-    return cast<Decl>(DC);
+    return DC;
 
   case Decl::ObjCProtocol:
     if (const ObjCProtocolDecl *Def
           = cast<ObjCProtocolDecl>(DC)->getDefinition())
       return Def;
-    break;
+    return 0;
 
   // FIXME: These are defined in one place, but properties in class extensions
   // end up being back-patched into the main interface. See
   // Sema::HandlePropertyInClassExtension for the offending code.
   case Decl::ObjCInterface:
-    break;
+    return 0;
     
   default:
     llvm_unreachable("Unhandled DeclContext in AST reader");
   }
   
-  return 0;
+  llvm_unreachable("Unhandled decl kind");
 }
 
 bool serialization::isRedeclarableDeclKind(unsigned Kind) {
index d930854..76ef904 100644 (file)
@@ -68,7 +68,7 @@ unsigned ComputeHash(Selector Sel);
 /// single place in the source code, so they have definitive declarations
 /// associated with them. C++ namespaces, on the other hand, can have
 /// multiple definitions.
-const Decl *getDefinitiveDeclContext(const DeclContext *DC);
+const DeclContext *getDefinitiveDeclContext(const DeclContext *DC);
 
 /// \brief Determine whether the given declaration kind is redeclarable.
 bool isRedeclarableDeclKind(unsigned Kind);
index 4e6e6db..3acf5b5 100644 (file)
@@ -5323,8 +5323,8 @@ namespace {
 /// NDEBUG checking.
 static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC,
                                               ASTReader &Reader) {
-  if (const Decl *D = getDefinitiveDeclContext(DC))
-    return Reader.getOwningModuleFile(D);
+  if (const DeclContext *DefDC = getDefinitiveDeclContext(DC))
+    return Reader.getOwningModuleFile(cast<Decl>(DefDC));
 
   return 0;
 }