Relax the assertion in ASTLocation's ctor: if the decl is not the immediate
parent of the stmt, find the immediate parent for the stmt.

This is because sometimes we cannot get the immediate decl of the stmt when
creating the ASTLocation. We can only get a parent of the stmt.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76159 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/Index/ASTLocation.h b/include/clang/Index/ASTLocation.h
index 26c3f31..6058623 100644
--- a/include/clang/Index/ASTLocation.h
+++ b/include/clang/Index/ASTLocation.h
@@ -42,11 +42,7 @@
 public:
   ASTLocation() : D(0), Stm(0) {}
 
-  explicit ASTLocation(const Decl *d, const Stmt *stm = 0)
-    : D(const_cast<Decl*>(d)), Stm(const_cast<Stmt*>(stm)) {
-    assert((Stm == 0 || isImmediateParent(D, Stm)) &&
-           "The Decl is not the immediate parent of the Stmt.");
-  }
+  explicit ASTLocation(const Decl *d, const Stmt *stm = 0);
 
   const Decl *getDecl() const { return D; }
   const Stmt *getStmt() const { return Stm; }
diff --git a/lib/Index/ASTLocation.cpp b/lib/Index/ASTLocation.cpp
index 3cd657b..3beff3f 100644
--- a/lib/Index/ASTLocation.cpp
+++ b/lib/Index/ASTLocation.cpp
@@ -61,6 +61,16 @@
   return 0;
 }
 
+ASTLocation::ASTLocation(const Decl *d, const Stmt *stm)
+  : D(const_cast<Decl*>(d)), Stm(const_cast<Stmt*>(stm)) {
+  if (Stm) {
+    Decl *Parent = FindImmediateParent(D, Stm);
+    assert(Parent);
+    D = Parent;
+  }
+}
+
+
 bool ASTLocation::isImmediateParent(Decl *D, Stmt *Node) {
   assert(D && Node && "Passed null Decl or null Stmt");
   return D == FindImmediateParent(D, Node);