[llvm-branch-commits] [clang] 833f8c9 - [clang] Fix libdl linking for libclang in standalone mode

2020-07-24 Thread Hans Wennborg via llvm-branch-commits

Author: Tobias Hieta
Date: 2020-07-24T11:44:55+02:00
New Revision: 833f8c958601bb640ba6a25d627c1dc58dad14d2

URL: 
https://github.com/llvm/llvm-project/commit/833f8c958601bb640ba6a25d627c1dc58dad14d2
DIFF: 
https://github.com/llvm/llvm-project/commit/833f8c958601bb640ba6a25d627c1dc58dad14d2.diff

LOG: [clang] Fix libdl linking for libclang in standalone mode

Differential Revision: https://reviews.llvm.org/D81385

(cherry picked from commit a41af6e41e6fcf3e7030feaf24057cbe8291b748)

Added: 


Modified: 
clang/tools/libclang/CMakeLists.txt

Removed: 




diff  --git a/clang/tools/libclang/CMakeLists.txt 
b/clang/tools/libclang/CMakeLists.txt
index 9b34682cc49b..a4077140acee 100644
--- a/clang/tools/libclang/CMakeLists.txt
+++ b/clang/tools/libclang/CMakeLists.txt
@@ -68,7 +68,12 @@ endif ()
 
 if (HAVE_LIBDL)
   list(APPEND LIBS ${CMAKE_DL_LIBS})
-endif()
+elseif (CLANG_BUILT_STANDALONE)
+  find_library(DL_LIBRARY_PATH dl)
+  if (DL_LIBRARY_PATH)
+list(APPEND LIBS dl)
+  endif ()
+endif ()
 
 option(LIBCLANG_BUILD_STATIC
   "Build libclang as a static library (in addition to a shared one)" OFF)



___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] 3c1fca8 - Fix issue in typo handling which could lead clang to hang

2020-07-24 Thread David Goldman via llvm-branch-commits

Author: David Goldman
Date: 2020-07-24T17:02:06-04:00
New Revision: 3c1fca803bc14617b67ba2125e1b4b77190e9f86

URL: 
https://github.com/llvm/llvm-project/commit/3c1fca803bc14617b67ba2125e1b4b77190e9f86
DIFF: 
https://github.com/llvm/llvm-project/commit/3c1fca803bc14617b67ba2125e1b4b77190e9f86.diff

LOG: Fix issue in typo handling which could lead clang to hang

Summary:
We need to detect when certain TypoExprs are not being transformed
due to invalid trees, otherwise we risk endlessly trying to fix it.

Reviewers: rsmith

Subscribers: cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D84067

(cherry picked from commit dde98c82c0ad02410229e7e5c9efcbb0ab42a995)

Added: 
clang/test/Sema/typo-correction-no-hang.cpp

Modified: 
clang/include/clang/Sema/SemaInternal.h
clang/lib/Sema/SemaExprCXX.cpp
clang/test/Sema/typo-correction-recursive.cpp

Removed: 




diff  --git a/clang/include/clang/Sema/SemaInternal.h 
b/clang/include/clang/Sema/SemaInternal.h
index cdaf7b70a92f..842eec099540 100644
--- a/clang/include/clang/Sema/SemaInternal.h
+++ b/clang/include/clang/Sema/SemaInternal.h
@@ -168,6 +168,11 @@ class TypoCorrectionConsumer : public VisibleDeclConsumer {
 return TC;
   }
 
+  /// In the case of deeply invalid expressions, `getNextCorrection()` will
+  /// never be called since the transform never makes progress. If we don't
+  /// detect this we risk trying to correct typos forever.
+  bool hasMadeAnyCorrectionProgress() const { return CurrentTCIndex != 0; }
+
   /// Reset the consumer's position in the stream of viable corrections
   /// (i.e. getNextCorrection() will return each of the previously returned
   /// corrections in order before returning any new corrections).

diff  --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index d885920b6c14..77bd1ab360b2 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -7977,19 +7977,26 @@ class TransformTypos : public 
TreeTransform {
 }
   }
 
-  /// If corrections for the first TypoExpr have been exhausted for a
-  /// given combination of the other TypoExprs, retry those corrections against
-  /// the next combination of substitutions for the other TypoExprs by 
advancing
-  /// to the next potential correction of the second TypoExpr. For the second
-  /// and subsequent TypoExprs, if its stream of corrections has been 
exhausted,
-  /// the stream is reset and the next TypoExpr's stream is advanced by one (a
-  /// TypoExpr's correction stream is advanced by removing the TypoExpr from 
the
-  /// TransformCache). Returns true if there is still any untried combinations
-  /// of corrections.
+  /// Try to advance the typo correction state of the first unfinished 
TypoExpr.
+  /// We allow advancement of the correction stream by removing it from the
+  /// TransformCache which allows `TransformTypoExpr` to advance during the
+  /// next transformation attempt.
+  ///
+  /// Any substitution attempts for the previous TypoExprs (which must have 
been
+  /// finished) will need to be retried since it's possible that they will now
+  /// be invalid given the latest advancement.
+  ///
+  /// We need to be sure that we're making progress - it's possible that the
+  /// tree is so malformed that the transform never makes it to the
+  /// `TransformTypoExpr`.
+  ///
+  /// Returns true if there are any untried correction combinations.
   bool CheckAndAdvanceTypoExprCorrectionStreams() {
 for (auto TE : TypoExprs) {
   auto &State = SemaRef.getTypoExprState(TE);
   TransformCache.erase(TE);
+  if (!State.Consumer->hasMadeAnyCorrectionProgress())
+return false;
   if (!State.Consumer->finished())
 return true;
   State.Consumer->resetCorrectionStream();

diff  --git a/clang/test/Sema/typo-correction-no-hang.cpp 
b/clang/test/Sema/typo-correction-no-hang.cpp
new file mode 100644
index ..3c591645be25
--- /dev/null
+++ b/clang/test/Sema/typo-correction-no-hang.cpp
@@ -0,0 +1,40 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// From `test/Sema/typo-correction.c` but for C++ since the behavior varies
+// between the two languages.
+struct rdar38642201 {
+  int fieldName;
+};
+
+void rdar38642201_callee(int x, int y);
+void rdar38642201_caller() {
+  struct rdar38642201 structVar;
+  rdar38642201_callee(
+  structVar1.fieldName1.member1,  //expected-error{{use of undeclared 
identifier 'structVar1'}}
+  structVar2.fieldName2.member2); //expected-error{{use of undeclared 
identifier 'structVar2'}}
+}
+
+// Similar reproducer.
+class A {
+public:
+  int minut() const = delete;
+  int hour() const = delete;
+
+  int longit() const; //expected-note{{'longit' declared here}}
+  int latit() const;
+};
+
+class B {
+public:
+  A depar() const { return A(); }
+};
+
+int Foo(const B &b) {
+  return b.deparT().hours() * 60 + //expected-