Index: tools/clang/scripts/update.sh |
diff --git a/tools/clang/scripts/update.sh b/tools/clang/scripts/update.sh |
index 7c60472c5932707635c50fe584cd13c430b70f92..ae9074312a97bd2b256b33576dd33efc4764b842 100755 |
--- a/tools/clang/scripts/update.sh |
+++ b/tools/clang/scripts/update.sh |
@@ -8,7 +8,12 @@ |
# Do NOT CHANGE this if you don't know what you're doing -- see |
# https://code.google.com/p/chromium/wiki/UpdatingClang |
# Reverting problematic clang rolls is safe, though. |
-CLANG_REVISION=223108 |
+CLANG_REVISION=231191 |
+ |
+# This is incremented when pushing a new build of Clang at the same revision. |
+CLANG_SUB_REVISION=1 |
+ |
+PACKAGE_VERSION="${CLANG_REVISION}-${CLANG_SUB_REVISION}" |
THIS_DIR="$(dirname "${0}")" |
LLVM_DIR="${THIS_DIR}/../../../third_party/llvm" |
@@ -23,6 +28,7 @@ LIBCXXABI_DIR="${LLVM_DIR}/projects/libcxxabi" |
ANDROID_NDK_DIR="${THIS_DIR}/../../../third_party/android_tools/ndk" |
STAMP_FILE="${LLVM_DIR}/../llvm-build/cr_build_revision" |
CHROMIUM_TOOLS_DIR="${THIS_DIR}/.." |
+BINUTILS_DIR="${THIS_DIR}/../../../third_party/binutils" |
ABS_CHROMIUM_TOOLS_DIR="${PWD}/${CHROMIUM_TOOLS_DIR}" |
ABS_LIBCXX_DIR="${PWD}/${LIBCXX_DIR}" |
@@ -30,10 +36,13 @@ ABS_LIBCXXABI_DIR="${PWD}/${LIBCXXABI_DIR}" |
ABS_LLVM_DIR="${PWD}/${LLVM_DIR}" |
ABS_LLVM_BUILD_DIR="${PWD}/${LLVM_BUILD_DIR}" |
ABS_COMPILER_RT_DIR="${PWD}/${COMPILER_RT_DIR}" |
+ABS_BINUTILS_DIR="${PWD}/${BINUTILS_DIR}" |
# ${A:-a} returns $A if it's set, a else. |
LLVM_REPO_URL=${LLVM_URL:-https://llvm.org/svn/llvm-project} |
+CDS_URL=https://commondatastorage.googleapis.com/chromium-browser-clang |
+ |
if [[ -z "$GYP_DEFINES" ]]; then |
GYP_DEFINES= |
fi |
@@ -51,6 +60,7 @@ if [[ -n ${LLVM_FORCE_HEAD_REVISION:-''} ]]; then |
# --print-revision, stamp file logic, etc. all works naturally. |
CLANG_REVISION=$(svn info "$LLVM_REPO_URL" \ |
| grep 'Last Changed Rev' | awk '{ printf $4; }') |
+ PACKAGE_VERSION="${CLANG_REVISION}-0" |
fi |
# Use both the clang revision and the plugin revisions to test for updates. |
@@ -88,7 +98,7 @@ while [[ $# > 0 ]]; do |
force_local_build=yes |
;; |
--print-revision) |
- echo $CLANG_REVISION |
+ echo $PACKAGE_VERSION |
exit 0 |
;; |
--run-tests) |
@@ -161,6 +171,40 @@ if [[ -n ${LLVM_FORCE_HEAD_REVISION:-''} ]]; then |
with_android= |
fi |
+ LLVM_BUILD_TOOLS_DIR="${ABS_LLVM_DIR}/../llvm-build-tools" |
+ |
+ if [[ "${OS}" == "Linux" ]] && [[ -z "${gcc_toolchain}" ]]; then |
+ if [[ $(gcc -dumpversion) < "4.7.0" ]]; then |
+ # We need a newer GCC version. |
+ if [[ ! -e "${LLVM_BUILD_TOOLS_DIR}/gcc482" ]]; then |
+ echo "Downloading pre-built GCC 4.8.2..." |
+ mkdir -p "${LLVM_BUILD_TOOLS_DIR}" |
+ curl --fail -L "${CDS_URL}/tools/gcc482.tgz" | \ |
+ tar zxf - -C "${LLVM_BUILD_TOOLS_DIR}" |
+ echo Done |
+ fi |
+ gcc_toolchain="${LLVM_BUILD_TOOLS_DIR}/gcc482" |
+ else |
+ # Always set gcc_toolchain; llvm-symbolizer needs the bundled libstdc++. |
+ gcc_toolchain="$(dirname $(dirname $(which gcc)))" |
+ fi |
+ fi |
+ |
+ if [[ "${OS}" == "Linux" ]]; then |
+ # TODO(hans): Might need to make this work on Mac eventually. |
+ if [[ $(cmake --version | grep -Eo '[0-9.]+') < "3.0" ]]; then |
+ # We need a newer CMake version. |
+ if [[ ! -e "${LLVM_BUILD_TOOLS_DIR}/cmake310" ]]; then |
+ echo "Downloading pre-built CMake 3.10..." |
+ mkdir -p "${LLVM_BUILD_TOOLS_DIR}" |
+ curl --fail -L "${CDS_URL}/tools/cmake310.tgz" | \ |
+ tar zxf - -C "${LLVM_BUILD_TOOLS_DIR}" |
+ echo Done |
+ fi |
+ export PATH="${LLVM_BUILD_TOOLS_DIR}/cmake310/bin:${PATH}" |
+ fi |
+ fi |
+ |
echo "LLVM_FORCE_HEAD_REVISION was set; using r${CLANG_REVISION}" |
fi |
@@ -193,8 +237,8 @@ if [[ -f "${STAMP_FILE}" ]]; then |
PREVIOUSLY_BUILT_REVISON=$(cat "${STAMP_FILE}") |
if [[ -z "$force_local_build" ]] && \ |
[[ "${PREVIOUSLY_BUILT_REVISON}" = \ |
- "${CLANG_AND_PLUGINS_REVISION}" ]]; then |
- echo "Clang already at ${CLANG_AND_PLUGINS_REVISION}" |
+ "${PACKAGE_VERSION}" ]]; then |
+ echo "Clang already at ${PACKAGE_VERSION}" |
exit 0 |
fi |
fi |
@@ -205,8 +249,7 @@ rm -f "${STAMP_FILE}" |
if [[ -z "$force_local_build" ]]; then |
# Check if there's a prebuilt binary and if so just fetch that. That's faster, |
# and goma relies on having matching binary hashes on client and server too. |
- CDS_URL=https://commondatastorage.googleapis.com/chromium-browser-clang |
- CDS_FILE="clang-${CLANG_REVISION}.tgz" |
+ CDS_FILE="clang-${PACKAGE_VERSION}.tgz" |
CDS_OUT_DIR=$(mktemp -d -t clang_download.XXXXXX) |
CDS_OUTPUT="${CDS_OUT_DIR}/${CDS_FILE}" |
if [ "${OS}" = "Linux" ]; then |
@@ -228,12 +271,12 @@ if [[ -z "$force_local_build" ]]; then |
rm -rf "${LLVM_BUILD_DIR}" |
mkdir -p "${LLVM_BUILD_DIR}" |
tar -xzf "${CDS_OUTPUT}" -C "${LLVM_BUILD_DIR}" |
- echo clang "${CLANG_REVISION}" unpacked |
- echo "${CLANG_AND_PLUGINS_REVISION}" > "${STAMP_FILE}" |
+ echo clang "${PACKAGE_VERSION}" unpacked |
+ echo "${PACKAGE_VERSION}" > "${STAMP_FILE}" |
rm -rf "${CDS_OUT_DIR}" |
exit 0 |
else |
- echo Did not find prebuilt clang at r"${CLANG_REVISION}", building |
+ echo Did not find prebuilt clang "${PACKAGE_VERSION}", building |
fi |
fi |
@@ -277,6 +320,8 @@ for i in \ |
"${CLANG_DIR}/lib/Sema/SemaExprCXX.cpp" \ |
"${CLANG_DIR}/test/SemaCXX/default2.cpp" \ |
"${CLANG_DIR}/test/SemaCXX/typo-correction-delayed.cpp" \ |
+ "${COMPILER_RT_DIR}/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc" \ |
+ "${COMPILER_RT_DIR}/test/tsan/signal_segv_handler.cc" \ |
; do |
if [[ -e "${i}" ]]; then |
rm -f "${i}" # For unversioned files. |
@@ -359,349 +404,6 @@ EOF |
patch -p0 |
popd |
- # Apply r223211: "Revert r222997." |
- pushd "${LLVM_DIR}" |
- cat << 'EOF' | |
---- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp |
-+++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp |
-@@ -921,8 +921,6 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { |
- Value *OriginPtr = |
- getOriginPtrForArgument(&FArg, EntryIRB, ArgOffset); |
- setOrigin(A, EntryIRB.CreateLoad(OriginPtr)); |
-- } else { |
-- setOrigin(A, getCleanOrigin()); |
- } |
- } |
- ArgOffset += RoundUpToAlignment(Size, kShadowTLSAlignment); |
-@@ -942,13 +940,15 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { |
- /// \brief Get the origin for a value. |
- Value *getOrigin(Value *V) { |
- if (!MS.TrackOrigins) return nullptr; |
-- if (!PropagateShadow) return getCleanOrigin(); |
-- if (isa<Constant>(V)) return getCleanOrigin(); |
-- assert((isa<Instruction>(V) || isa<Argument>(V)) && |
-- "Unexpected value type in getOrigin()"); |
-- Value *Origin = OriginMap[V]; |
-- assert(Origin && "Missing origin"); |
-- return Origin; |
-+ if (isa<Instruction>(V) || isa<Argument>(V)) { |
-+ Value *Origin = OriginMap[V]; |
-+ if (!Origin) { |
-+ DEBUG(dbgs() << "NO ORIGIN: " << *V << "\n"); |
-+ Origin = getCleanOrigin(); |
-+ } |
-+ return Origin; |
-+ } |
-+ return getCleanOrigin(); |
- } |
- |
- /// \brief Get the origin for i-th argument of the instruction I. |
-@@ -1088,7 +1088,6 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { |
- IRB.CreateStore(getCleanShadow(&I), ShadowPtr); |
- |
- setShadow(&I, getCleanShadow(&I)); |
-- setOrigin(&I, getCleanOrigin()); |
- } |
- |
- void visitAtomicRMWInst(AtomicRMWInst &I) { |
-EOF |
- patch -p1 |
- popd |
- |
- # Apply r223219: "Preserve LD_LIBRARY_PATH when using the 'env' command" |
- pushd "${CLANG_DIR}" |
- cat << 'EOF' | |
---- a/test/Driver/env.c |
-+++ b/test/Driver/env.c |
-@@ -5,12 +5,14 @@ |
- // REQUIRES: shell |
- // |
- // The PATH variable is heavily used when trying to find a linker. |
--// RUN: env -i LC_ALL=C %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ |
-+// RUN: env -i LC_ALL=C LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ |
-+// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ |
- // RUN: --target=i386-unknown-linux \ |
- // RUN: --sysroot=%S/Inputs/basic_linux_tree \ |
- // RUN: | FileCheck --check-prefix=CHECK-LD-32 %s |
- // |
--// RUN: env -i LC_ALL=C PATH="" %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ |
-+// RUN: env -i LC_ALL=C PATH="" LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \ |
-+// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ |
- // RUN: --target=i386-unknown-linux \ |
- // RUN: --sysroot=%S/Inputs/basic_linux_tree \ |
- // RUN: | FileCheck --check-prefix=CHECK-LD-32 %s |
-EOF |
- patch -p1 |
- popd |
- |
- # Revert r220714: "Frontend: Define __EXCEPTIONS if -fexceptions is passed" |
- pushd "${CLANG_DIR}" |
- cat << 'EOF' | |
---- a/lib/Frontend/InitPreprocessor.cpp |
-+++ b/lib/Frontend/InitPreprocessor.cpp |
-@@ -566,7 +566,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI, |
- Builder.defineMacro("__BLOCKS__"); |
- } |
- |
-- if (!LangOpts.MSVCCompat && LangOpts.Exceptions) |
-+ if (!LangOpts.MSVCCompat && LangOpts.CXXExceptions) |
- Builder.defineMacro("__EXCEPTIONS"); |
- if (!LangOpts.MSVCCompat && LangOpts.RTTI) |
- Builder.defineMacro("__GXX_RTTI"); |
-diff --git a/test/Frontend/exceptions.c b/test/Frontend/exceptions.c |
-index 981b5b9..4bbaaa3 100644 |
---- a/test/Frontend/exceptions.c |
-+++ b/test/Frontend/exceptions.c |
-@@ -1,9 +1,6 @@ |
--// RUN: %clang_cc1 -fms-compatibility -fexceptions -fcxx-exceptions -DMS_MODE -verify %s |
-+// RUN: %clang_cc1 -fms-compatibility -fexceptions -fcxx-exceptions -verify %s |
- // expected-no-diagnostics |
- |
--// RUN: %clang_cc1 -fms-compatibility -fexceptions -verify %s |
--// expected-no-diagnostics |
-- |
--#if defined(MS_MODE) && defined(__EXCEPTIONS) |
-+#if defined(__EXCEPTIONS) |
- #error __EXCEPTIONS should not be defined. |
- #endif |
-diff --git a/test/Preprocessor/predefined-exceptions.m b/test/Preprocessor/predefined-exceptions.m |
-index 0791075..c13f429 100644 |
---- a/test/Preprocessor/predefined-exceptions.m |
-+++ b/test/Preprocessor/predefined-exceptions.m |
-@@ -1,6 +1,6 @@ |
- // RUN: %clang_cc1 -x objective-c -fobjc-exceptions -fexceptions -E -dM %s | FileCheck -check-prefix=CHECK-OBJC-NOCXX %s |
- // CHECK-OBJC-NOCXX: #define OBJC_ZEROCOST_EXCEPTIONS 1 |
--// CHECK-OBJC-NOCXX: #define __EXCEPTIONS 1 |
-+// CHECK-OBJC-NOCXX-NOT: #define __EXCEPTIONS 1 |
- |
- // RUN: %clang_cc1 -x objective-c++ -fobjc-exceptions -fexceptions -fcxx-exceptions -E -dM %s | FileCheck -check-prefix=CHECK-OBJC-CXX %s |
- // CHECK-OBJC-CXX: #define OBJC_ZEROCOST_EXCEPTIONS 1 |
-EOF |
- patch -p1 |
- popd |
- |
- # Apply r223177: "Ensure typos in the default values of template parameters get diagnosed." |
- pushd "${CLANG_DIR}" |
- cat << 'EOF' | |
---- a/lib/Parse/ParseTemplate.cpp |
-+++ b/lib/Parse/ParseTemplate.cpp |
-@@ -676,7 +676,7 @@ Parser::ParseNonTypeTemplateParameter(unsigned Depth, unsigned Position) { |
- GreaterThanIsOperatorScope G(GreaterThanIsOperator, false); |
- EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated); |
- |
-- DefaultArg = ParseAssignmentExpression(); |
-+ DefaultArg = Actions.CorrectDelayedTyposInExpr(ParseAssignmentExpression()); |
- if (DefaultArg.isInvalid()) |
- SkipUntil(tok::comma, tok::greater, StopAtSemi | StopBeforeMatch); |
- } |
-diff --git a/test/SemaCXX/default2.cpp b/test/SemaCXX/default2.cpp |
-index 1626044..c4d40b4 100644 |
---- a/test/SemaCXX/default2.cpp |
-+++ b/test/SemaCXX/default2.cpp |
-@@ -122,3 +122,9 @@ class XX { |
- void A(int length = -1 ) { } |
- void B() { A(); } |
- }; |
-+ |
-+template <int I = (1 * I)> struct S {}; // expected-error-re {{use of undeclared identifier 'I'{{$}}}} |
-+S<1> s; |
-+ |
-+template <int I1 = I2, int I2 = 1> struct T {}; // expected-error-re {{use of undeclared identifier 'I2'{{$}}}} |
-+T<0, 1> t; |
-diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp |
-index bff1d76..7bf9258 100644 |
---- a/test/SemaCXX/typo-correction-delayed.cpp |
-+++ b/test/SemaCXX/typo-correction-delayed.cpp |
-@@ -102,3 +102,7 @@ void f(int *i) { |
- __atomic_load(i, i, something_something); // expected-error-re {{use of undeclared identifier 'something_something'{{$}}}} |
- } |
- } |
-+ |
-+const int DefaultArg = 9; // expected-note {{'DefaultArg' declared here}} |
-+template <int I = defaultArg> struct S {}; // expected-error {{use of undeclared identifier 'defaultArg'; did you mean 'DefaultArg'?}} |
-+S<1> s; |
-EOF |
- patch -p1 |
- popd |
- |
- # Apply r223209: "Handle delayed corrections in a couple more error paths in ParsePostfixExpressionSuffix." |
- pushd "${CLANG_DIR}" |
- cat << 'EOF' | |
---- a/lib/Parse/ParseExpr.cpp |
-+++ b/lib/Parse/ParseExpr.cpp |
-@@ -1390,6 +1390,7 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { |
- SourceLocation OpenLoc = ConsumeToken(); |
- |
- if (ParseSimpleExpressionList(ExecConfigExprs, ExecConfigCommaLocs)) { |
-+ (void)Actions.CorrectDelayedTyposInExpr(LHS); |
- LHS = ExprError(); |
- } |
- |
-@@ -1440,6 +1441,7 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { |
- if (Tok.isNot(tok::r_paren)) { |
- if (ParseExpressionList(ArgExprs, CommaLocs, &Sema::CodeCompleteCall, |
- LHS.get())) { |
-+ (void)Actions.CorrectDelayedTyposInExpr(LHS); |
- LHS = ExprError(); |
- } |
- } |
-diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp |
-index 7bf9258..f7ef015 100644 |
---- a/test/SemaCXX/typo-correction-delayed.cpp |
-+++ b/test/SemaCXX/typo-correction-delayed.cpp |
-@@ -106,3 +106,9 @@ void f(int *i) { |
- const int DefaultArg = 9; // expected-note {{'DefaultArg' declared here}} |
- template <int I = defaultArg> struct S {}; // expected-error {{use of undeclared identifier 'defaultArg'; did you mean 'DefaultArg'?}} |
- S<1> s; |
-+ |
-+namespace foo {} |
-+void test_paren_suffix() { |
-+ foo::bar({5, 6}); // expected-error-re {{no member named 'bar' in namespace 'foo'{{$}}}} \ |
-+ // expected-error {{expected expression}} |
-+} |
-EOF |
- patch -p1 |
- popd |
- |
- # Apply r223705: "Handle possible TypoExprs in member initializers." |
- pushd "${CLANG_DIR}" |
- cat << 'EOF' | |
---- a/lib/Sema/SemaDeclCXX.cpp |
-+++ b/lib/Sema/SemaDeclCXX.cpp |
-@@ -2813,6 +2813,11 @@ Sema::BuildMemInitializer(Decl *ConstructorD, |
- SourceLocation IdLoc, |
- Expr *Init, |
- SourceLocation EllipsisLoc) { |
-+ ExprResult Res = CorrectDelayedTyposInExpr(Init); |
-+ if (!Res.isUsable()) |
-+ return true; |
-+ Init = Res.get(); |
-+ |
- if (!ConstructorD) |
- return true; |
- |
-diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp |
-index f7ef015..d303b58 100644 |
---- a/test/SemaCXX/typo-correction-delayed.cpp |
-+++ b/test/SemaCXX/typo-correction-delayed.cpp |
-@@ -112,3 +112,10 @@ void test_paren_suffix() { |
- foo::bar({5, 6}); // expected-error-re {{no member named 'bar' in namespace 'foo'{{$}}}} \ |
- // expected-error {{expected expression}} |
- } |
-+ |
-+const int kNum = 10; // expected-note {{'kNum' declared here}} |
-+class SomeClass { |
-+ int Kind; |
-+public: |
-+ explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}} |
-+}; |
-EOF |
- patch -p1 |
- popd |
- |
- # Apply r224172: "Typo correction: Ignore temporary binding exprs after overload resolution" |
- pushd "${CLANG_DIR}" |
- cat << 'EOF' | |
---- a/lib/Sema/SemaExprCXX.cpp |
-+++ b/lib/Sema/SemaExprCXX.cpp |
-@@ -6105,8 +6105,13 @@ public: |
- auto Result = BaseTransform::RebuildCallExpr(Callee, LParenLoc, Args, |
- RParenLoc, ExecConfig); |
- if (auto *OE = dyn_cast<OverloadExpr>(Callee)) { |
-- if (!Result.isInvalid() && Result.get()) |
-- OverloadResolution[OE] = cast<CallExpr>(Result.get())->getCallee(); |
-+ if (!Result.isInvalid() && Result.get()) { |
-+ Expr *ResultCall = Result.get(); |
-+ if (auto *BE = dyn_cast<CXXBindTemporaryExpr>(ResultCall)) |
-+ ResultCall = BE->getSubExpr(); |
-+ if (auto *CE = dyn_cast<CallExpr>(ResultCall)) |
-+ OverloadResolution[OE] = CE->getCallee(); |
-+ } |
- } |
- return Result; |
- } |
-diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp |
-index d303b58..d42888f 100644 |
---- a/test/SemaCXX/typo-correction-delayed.cpp |
-+++ b/test/SemaCXX/typo-correction-delayed.cpp |
-@@ -119,3 +119,23 @@ class SomeClass { |
- public: |
- explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}} |
- }; |
-+ |
-+extern "C" int printf(const char *, ...); |
-+ |
-+// There used to be an issue with typo resolution inside overloads. |
-+struct AssertionResult { |
-+ ~AssertionResult(); |
-+ operator bool(); |
-+ int val; |
-+}; |
-+AssertionResult Compare(const char *a, const char *b); |
-+AssertionResult Compare(int a, int b); |
-+int main() { |
-+ // expected-note@+1 {{'result' declared here}} |
-+ const char *result; |
-+ // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean 'result'?}} |
-+ if (AssertionResult ar = (Compare("value1", resulta))) |
-+ ; |
-+ else |
-+ printf("ar: %d\n", ar.val); |
-+} |
-EOF |
- patch -p1 |
- popd |
- |
- # Apply r224173: "Implement feedback on r224172 in PR21899" |
- pushd "${CLANG_DIR}" |
- cat << 'EOF' | |
---- a/lib/Sema/SemaExprCXX.cpp |
-+++ b/lib/Sema/SemaExprCXX.cpp |
-@@ -6105,7 +6105,7 @@ public: |
- auto Result = BaseTransform::RebuildCallExpr(Callee, LParenLoc, Args, |
- RParenLoc, ExecConfig); |
- if (auto *OE = dyn_cast<OverloadExpr>(Callee)) { |
-- if (!Result.isInvalid() && Result.get()) { |
-+ if (Result.isUsable()) { |
- Expr *ResultCall = Result.get(); |
- if (auto *BE = dyn_cast<CXXBindTemporaryExpr>(ResultCall)) |
- ResultCall = BE->getSubExpr(); |
-diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp |
-index d42888f..7879d29 100644 |
---- a/test/SemaCXX/typo-correction-delayed.cpp |
-+++ b/test/SemaCXX/typo-correction-delayed.cpp |
-@@ -120,22 +120,13 @@ public: |
- explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}} |
- }; |
- |
--extern "C" int printf(const char *, ...); |
-- |
- // There used to be an issue with typo resolution inside overloads. |
--struct AssertionResult { |
-- ~AssertionResult(); |
-- operator bool(); |
-- int val; |
--}; |
--AssertionResult Compare(const char *a, const char *b); |
--AssertionResult Compare(int a, int b); |
--int main() { |
-+struct AssertionResult { ~AssertionResult(); }; |
-+AssertionResult Overload(const char *a); |
-+AssertionResult Overload(int a); |
-+void UseOverload() { |
- // expected-note@+1 {{'result' declared here}} |
- const char *result; |
- // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean 'result'?}} |
-- if (AssertionResult ar = (Compare("value1", resulta))) |
-- ; |
-- else |
-- printf("ar: %d\n", ar.val); |
-+ Overload(resulta); |
- } |
-EOF |
- patch -p1 |
- popd |
- |
# This Go bindings test doesn't work after the bootstrap build on Linux. (PR21552) |
pushd "${LLVM_DIR}" |
cat << 'EOF' | |
@@ -718,6 +420,7 @@ EOF |
patch -p0 |
popd |
+ |
fi |
# Echo all commands. |
@@ -842,6 +545,12 @@ if [ "${OS}" = "Darwin" ]; then |
LDFLAGS+="-stdlib=libc++ -L${PWD}/libcxxbuild" |
fi |
+# Find the binutils include dir for the gold plugin. |
+BINUTILS_INCDIR="" |
+if [ "${OS}" = "Linux" ]; then |
+ BINUTILS_INCDIR="${ABS_BINUTILS_DIR}/Linux_x64/Release/include" |
+fi |
+ |
# Hook the Chromium tools into the LLVM build. Several Chromium tools have |
# dependencies on LLVM/Clang libraries. The LLVM build detects implicit tools |
# in the tools subdirectory, so install a shim CMakeLists.txt that forwards to |
@@ -861,6 +570,7 @@ MACOSX_DEPLOYMENT_TARGET=${deployment_target} cmake -GNinja \ |
-DCMAKE_BUILD_TYPE=Release \ |
-DLLVM_ENABLE_ASSERTIONS=ON \ |
-DLLVM_ENABLE_THREADS=OFF \ |
+ -DLLVM_BINUTILS_INCDIR="${BINUTILS_INCDIR}" \ |
-DCMAKE_C_COMPILER="${CC}" \ |
-DCMAKE_CXX_COMPILER="${CXX}" \ |
-DCMAKE_C_FLAGS="${CFLAGS}" \ |
@@ -970,4 +680,4 @@ if [[ -n "$run_tests" ]]; then |
fi |
# After everything is done, log success for this revision. |
-echo "${CLANG_AND_PLUGINS_REVISION}" > "${STAMP_FILE}" |
+echo "${PACKAGE_VERSION}" > "${STAMP_FILE}" |