]> granicus.if.org Git - clang/commitdiff
Take the non-reference type when constructing a dummy expression.
authorRichard Trieu <rtrieu@google.com>
Mon, 16 Mar 2015 21:49:43 +0000 (21:49 +0000)
committerRichard Trieu <rtrieu@google.com>
Mon, 16 Mar 2015 21:49:43 +0000 (21:49 +0000)
Otherwise, Expr will assert during construction with a reference type.

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

lib/Analysis/ThreadSafety.cpp
test/SemaCXX/thread-safety-reference-handling.cpp [new file with mode: 0644]

index a5782eea2ad9049c84bae549c3c0198f7d08eba5..e2c6ab5d94850f3bca4cbf1b8cf819472cfecf50 100644 (file)
@@ -2306,8 +2306,8 @@ void ThreadSafetyAnalyzer::runAnalysis(AnalysisDeclContext &AC) {
 
           // 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/test/SemaCXX/thread-safety-reference-handling.cpp b/test/SemaCXX/thread-safety-reference-handling.cpp
new file mode 100644 (file)
index 0000000..2f7eb48
--- /dev/null
@@ -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();
+}