Take the non-reference type when constructing a dummy expression.

Otherwise, Expr will assert during construction with a reference type.

llvm-svn: 232425
diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp
index a5782ee..e2c6ab5 100644
--- a/clang/lib/Analysis/ThreadSafety.cpp
+++ b/clang/lib/Analysis/ThreadSafety.cpp
@@ -2306,8 +2306,8 @@
 
           // Create a dummy expression,
           VarDecl *VD = const_cast<VarDecl*>(AD.getVarDecl());
-          DeclRefExpr DRE(VD, false, VD->getType(), VK_LValue,
-                          AD.getTriggerStmt()->getLocEnd());
+          DeclRefExpr DRE(VD, false, VD->getType().getNonReferenceType(),
+                          VK_LValue, AD.getTriggerStmt()->getLocEnd());
           LocksetBuilder.handleCall(&DRE, DD);
           break;
         }
diff --git a/clang/test/SemaCXX/thread-safety-reference-handling.cpp b/clang/test/SemaCXX/thread-safety-reference-handling.cpp
new file mode 100644
index 0000000..2f7eb48
--- /dev/null
+++ b/clang/test/SemaCXX/thread-safety-reference-handling.cpp
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -Wthread-safety-analysis -std=c++11 %s
+// expected-no-diagnostics
+
+class Base {
+public:
+  Base() {}
+  virtual ~Base();
+};
+
+class S : public Base {
+public:
+  ~S() override = default;
+};
+
+void Test() {
+  const S &s = S();
+}