summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhans <hans@chromium.org>2015-03-03 13:09:37 -0800
committerCommit bot <commit-bot@chromium.org>2015-03-03 21:10:09 +0000
commit365c5588df97683350ceabef4d8034c0d3faec78 (patch)
treed0e4955efed4abbff13a513c77cc6fc09fdcd191
parent85728971a76208ff2de87d9b5bb625dfd0bd9812 (diff)
downloadchromium_src-365c5588df97683350ceabef4d8034c0d3faec78.zip
chromium_src-365c5588df97683350ceabef4d8034c0d3faec78.tar.gz
chromium_src-365c5588df97683350ceabef4d8034c0d3faec78.tar.bz2
Revert "Roll Clang 223108:230914"
It seems the roll broke Android tests, see crbug.com/463436. Also, fix common.gypi to add a dependency on the Clang version when host_clang is set. We think this might be the reason the breakage didn't show on trybots when the roll landed: the host binaries weren't recompiled with the new Clang version. BUG=444089, 463436 NOTRY=true NOPRESUBMIT=true TBR=jln, jbauman Review URL: https://codereview.chromium.org/976833002 Cr-Commit-Position: refs/heads/master@{#318940}
-rw-r--r--build/common.gypi2
-rw-r--r--content/gpu/gpu_main.cc1
-rw-r--r--content/zygote/zygote_main_linux.cc1
-rw-r--r--sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc5
-rw-r--r--tools/clang/blink_gc_plugin/CMakeLists.txt2
-rw-r--r--tools/clang/blink_gc_plugin/Edge.h1
-rw-r--r--tools/clang/blink_gc_plugin/RecordInfo.h1
-rwxr-xr-xtools/clang/blink_gc_plugin/tests/test.sh1
-rwxr-xr-xtools/clang/scripts/blink_gc_plugin_flags.sh5
-rwxr-xr-xtools/clang/scripts/package.sh12
-rwxr-xr-xtools/clang/scripts/repackage.sh67
-rwxr-xr-xtools/clang/scripts/update.sh369
12 files changed, 432 insertions, 35 deletions
diff --git a/build/common.gypi b/build/common.gypi
index 2bf4ddd..ab0434a 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -2607,7 +2607,7 @@
],
},
}],
- ['clang==1 and OS!="win"', {
+ ['(clang==1 or host_clang==1) and OS!="win"', {
# This is here so that all files get recompiled after a clang roll and
# when turning clang on or off.
# (defines are passed via the command line, and build systems rebuild
diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc
index b34d42f..f73bb0d 100644
--- a/content/gpu/gpu_main.cc
+++ b/content/gpu/gpu_main.cc
@@ -61,7 +61,6 @@
#if defined(SANITIZER_COVERAGE)
#include <sanitizer/common_interface_defs.h>
-#include <sanitizer/coverage_interface.h>
#endif
const int kGpuTimeout = 10000;
diff --git a/content/zygote/zygote_main_linux.cc b/content/zygote/zygote_main_linux.cc
index 96fac21..efbfdb0 100644
--- a/content/zygote/zygote_main_linux.cc
+++ b/content/zygote/zygote_main_linux.cc
@@ -67,7 +67,6 @@
#if defined(SANITIZER_COVERAGE)
#include <sanitizer/common_interface_defs.h>
-#include <sanitizer/coverage_interface.h>
#endif
namespace content {
diff --git a/sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc b/sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc
index 8e7e144..2d337c6 100644
--- a/sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc
+++ b/sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc
@@ -651,10 +651,6 @@ ResultExpr RedirectAllSyscallsPolicy::EvaluateSyscall(int sysno) const {
return UnsafeTrap(AllowRedirectedSyscall, NULL);
}
-#if !defined(ADDRESS_SANITIZER)
-// ASan does not allow changing the signal handler for SIGBUS, and treats it as
-// a fatal signal.
-
int bus_handler_fd_ = -1;
void SigBusHandler(int, siginfo_t* info, void* void_context) {
@@ -683,7 +679,6 @@ BPF_TEST_C(SandboxBPF, SigBus, RedirectAllSyscallsPolicy) {
BPF_ASSERT(close(fds[1]) == 0);
BPF_ASSERT(c == 0x55);
}
-#endif // !defined(ADDRESS_SANITIZER)
BPF_TEST_C(SandboxBPF, SigMask, RedirectAllSyscallsPolicy) {
// Signal masks are potentially tricky to handle. For instance, if we
diff --git a/tools/clang/blink_gc_plugin/CMakeLists.txt b/tools/clang/blink_gc_plugin/CMakeLists.txt
index 7f1dee3..c511edf 100644
--- a/tools/clang/blink_gc_plugin/CMakeLists.txt
+++ b/tools/clang/blink_gc_plugin/CMakeLists.txt
@@ -1,6 +1,6 @@
# This line is read by update.sh and other scripts in tools/clang/scripts
# Note: The spaces are significant.
-set(LIBRARYNAME BlinkGCPlugin)
+set(LIBRARYNAME BlinkGCPlugin_14)
add_llvm_loadable_module("lib${LIBRARYNAME}"
BlinkGCPlugin.cpp
diff --git a/tools/clang/blink_gc_plugin/Edge.h b/tools/clang/blink_gc_plugin/Edge.h
index 7659968..d0b78b5 100644
--- a/tools/clang/blink_gc_plugin/Edge.h
+++ b/tools/clang/blink_gc_plugin/Edge.h
@@ -24,7 +24,6 @@ class Collection;
// Bare-bones visitor.
class EdgeVisitor {
public:
- virtual ~EdgeVisitor() {}
virtual void VisitValue(Value*) {}
virtual void VisitRawPtr(RawPtr*) {}
virtual void VisitRefPtr(RefPtr*) {}
diff --git a/tools/clang/blink_gc_plugin/RecordInfo.h b/tools/clang/blink_gc_plugin/RecordInfo.h
index da2f415..82fb604 100644
--- a/tools/clang/blink_gc_plugin/RecordInfo.h
+++ b/tools/clang/blink_gc_plugin/RecordInfo.h
@@ -23,7 +23,6 @@ class RecordCache;
class GraphPoint {
public:
GraphPoint() : traced_(false) {}
- virtual ~GraphPoint() {}
void MarkTraced() { traced_ = true; }
bool IsProperlyTraced() { return traced_ || !NeedsTracing().IsNeeded(); }
virtual const TracingStatus NeedsTracing() = 0;
diff --git a/tools/clang/blink_gc_plugin/tests/test.sh b/tools/clang/blink_gc_plugin/tests/test.sh
index 95bb261..02c7477 100755
--- a/tools/clang/blink_gc_plugin/tests/test.sh
+++ b/tools/clang/blink_gc_plugin/tests/test.sh
@@ -29,7 +29,6 @@ do_testcase() {
flags="$(cat "${3}")"
fi
local output="$("${CLANG_PATH}" -c -Wno-c++11-extensions \
- -Wno-inaccessible-base \
-Xclang -load -Xclang "${PLUGIN_PATH}" \
-Xclang -add-plugin -Xclang blink-gc-plugin ${flags} ${1} 2>&1)"
local json="${input%cpp}graph.json"
diff --git a/tools/clang/scripts/blink_gc_plugin_flags.sh b/tools/clang/scripts/blink_gc_plugin_flags.sh
index 38ea72d..3654808 100755
--- a/tools/clang/scripts/blink_gc_plugin_flags.sh
+++ b/tools/clang/scripts/blink_gc_plugin_flags.sh
@@ -13,6 +13,9 @@ if uname -s | grep -q Darwin; then
else
LIBSUFFIX=so
fi
+LIBNAME=\
+$(grep 'set(LIBRARYNAME' "$SRC_DIR"/tools/clang/blink_gc_plugin/CMakeLists.txt \
+ | cut -d ' ' -f 2 | tr -d ')')
FLAGS=""
PREFIX="-Xclang -plugin-arg-blink-gc-plugin -Xclang"
@@ -28,5 +31,5 @@ for arg in "$@"; do
fi
done
-echo -Xclang -load -Xclang $CLANG_LIB_PATH/libBlinkGCPlugin.$LIBSUFFIX \
+echo -Xclang -load -Xclang $CLANG_LIB_PATH/lib$LIBNAME.$LIBSUFFIX \
-Xclang -add-plugin -Xclang blink-gc-plugin $FLAGS
diff --git a/tools/clang/scripts/package.sh b/tools/clang/scripts/package.sh
index 453a166..e0c0fcc 100755
--- a/tools/clang/scripts/package.sh
+++ b/tools/clang/scripts/package.sh
@@ -52,7 +52,6 @@ LLVM_BOOTSTRAP_INSTALL_DIR="${LLVM_DIR}/../llvm-bootstrap-install"
LLVM_BUILD_DIR="${THIS_DIR}/../../../third_party/llvm-build"
LLVM_BIN_DIR="${LLVM_BUILD_DIR}/Release+Asserts/bin"
LLVM_LIB_DIR="${LLVM_BUILD_DIR}/Release+Asserts/lib"
-STAMP_FILE="${LLVM_DIR}/../llvm-build/cr_build_revision"
echo "Diff in llvm:" | tee buildlog.txt
svn stat "${LLVM_DIR}" 2>&1 | tee -a buildlog.txt
@@ -87,7 +86,8 @@ fi
"${THIS_DIR}"/update.sh --bootstrap --force-local-build --run-tests \
${extra_flags} 2>&1 | tee -a buildlog.txt
-R=$(cat "${STAMP_FILE}")
+R=$("${LLVM_BIN_DIR}/clang" --version | \
+ sed -ne 's/clang version .*(trunk \([0-9]*\))/\1/p')
PDIR=clang-$R
rm -rf $PDIR
@@ -122,7 +122,11 @@ fi
# Copy plugins. Some of the dylibs are pretty big, so copy only the ones we
# care about.
cp "${LLVM_LIB_DIR}/libFindBadConstructs.${SO_EXT}" $PDIR/lib
-cp "${LLVM_LIB_DIR}/libBlinkGCPlugin.${SO_EXT}" $PDIR/lib
+
+BLINKGCPLUGIN_LIBNAME=\
+$(grep 'set(LIBRARYNAME' "$THIS_DIR"/../blink_gc_plugin/CMakeLists.txt \
+ | cut -d ' ' -f 2 | tr -d ')')
+cp "${LLVM_LIB_DIR}/lib${BLINKGCPLUGIN_LIBNAME}.${SO_EXT}" $PDIR/lib
if [[ -n "${gcc_toolchain}" ]]; then
# Copy the stdlibc++.so.6 we linked Clang against so it can run.
@@ -178,5 +182,3 @@ fi
echo To upload, run:
echo gsutil cp -a public-read $PDIR.tgz \
gs://chromium-browser-clang/$PLATFORM/$PDIR.tgz
-
-# FIXME: Warn if the file already exists on the server.
diff --git a/tools/clang/scripts/repackage.sh b/tools/clang/scripts/repackage.sh
new file mode 100755
index 0000000..e19ab7e
--- /dev/null
+++ b/tools/clang/scripts/repackage.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This script will check out llvm and clang, build a full package
+# with the latest plugin revisions and then repackage an existing
+# clang-package with the new plugin revisions.
+
+# The new package can be uploaded to replace the existing clang
+# package at the same clang revision.
+
+THIS_DIR="$(dirname "${0}")"
+LLVM_BUILD_DIR="${THIS_DIR}/../../../third_party/llvm-build"
+LLVM_TAR_DIR="${LLVM_BUILD_DIR}/Release+Asserts"
+LLVM_BIN_DIR="${LLVM_TAR_DIR}/bin"
+LLVM_LIB_DIR="${LLVM_TAR_DIR}/lib"
+
+set -eu
+
+if [ "$(uname -s)" = "Darwin" ]; then
+ PLATFORM=Mac
+ SO_EXT="dylib"
+else
+ PLATFORM=Linux_x64
+ SO_EXT="so"
+fi
+
+# Build clang with the new plugin revisions.
+"$THIS_DIR"/package.sh $@
+
+R=$("${LLVM_BIN_DIR}/clang" --version | \
+ sed -ne 's/clang version .*(trunk \([0-9]*\))/\1/p')
+PDIR=clang-$R
+
+if [ ! -f "$PDIR.tgz" ]; then
+ echo "Could not find package archive $PDIR.tgz generated by package.sh"
+ exit 1
+fi
+
+# We don't want to change the clang binary, so fetch the current clang
+# package and add the plugin shared-libraries to the existing package.
+rm -rf $LLVM_BUILD_DIR
+"$THIS_DIR"/update.sh
+
+LIBNAME=\
+$(grep 'set(LIBRARYNAME' "$THIS_DIR"/../blink_gc_plugin/CMakeLists.txt \
+ | cut -d ' ' -f 2 | tr -d ')')
+LIBFILE=lib$LIBNAME.$SO_EXT
+
+# Check that we are actually creating the plugin at a new revision.
+if [ -f "$LLVM_LIB_DIR/$LIBFILE" ]; then
+ echo "The plugin revision $LIBNAME is already in the existing package."
+ exit 1
+fi
+
+cp $PDIR/lib/$LIBFILE "$LLVM_LIB_DIR/"
+if [ "$(uname -s)" = "Darwin" ]; then
+ tar zcf ${PDIR}_repack.tgz -C "$LLVM_TAR_DIR" bin include lib buildlog.txt
+else
+ tar zcf ${PDIR}_repack.tgz -C "$LLVM_TAR_DIR" bin lib buildlog.txt
+fi
+
+echo The clang package has been repackaged with $LIBNAME
+echo To upload, run:
+echo gsutil cp -a public-read ${PDIR}_repack.tgz \
+ gs://chromium-browser-clang/$PLATFORM/$PDIR.tgz
diff --git a/tools/clang/scripts/update.sh b/tools/clang/scripts/update.sh
index 798f7d2..e8b929f 100755
--- a/tools/clang/scripts/update.sh
+++ b/tools/clang/scripts/update.sh
@@ -8,12 +8,7 @@
# 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=230914
-
-# 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}"
+CLANG_REVISION=223108
THIS_DIR="$(dirname "${0}")"
LLVM_DIR="${THIS_DIR}/../../../third_party/llvm"
@@ -93,7 +88,7 @@ while [[ $# > 0 ]]; do
force_local_build=yes
;;
--print-revision)
- echo $PACKAGE_VERSION
+ echo $CLANG_REVISION
exit 0
;;
--run-tests)
@@ -203,8 +198,8 @@ if [[ -f "${STAMP_FILE}" ]]; then
PREVIOUSLY_BUILT_REVISON=$(cat "${STAMP_FILE}")
if [[ -z "$force_local_build" ]] && \
[[ "${PREVIOUSLY_BUILT_REVISON}" = \
- "${PACKAGE_VERSION}" ]]; then
- echo "Clang already at ${PACKAGE_VERSION}"
+ "${CLANG_AND_PLUGINS_REVISION}" ]]; then
+ echo "Clang already at ${CLANG_AND_PLUGINS_REVISION}"
exit 0
fi
fi
@@ -216,7 +211,7 @@ 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-${PACKAGE_VERSION}.tgz"
+ CDS_FILE="clang-${CLANG_REVISION}.tgz"
CDS_OUT_DIR=$(mktemp -d -t clang_download.XXXXXX)
CDS_OUTPUT="${CDS_OUT_DIR}/${CDS_FILE}"
if [ "${OS}" = "Linux" ]; then
@@ -238,12 +233,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 "${PACKAGE_VERSION}" unpacked
- echo "${PACKAGE_VERSION}" > "${STAMP_FILE}"
+ echo clang "${CLANG_REVISION}" unpacked
+ echo "${CLANG_AND_PLUGINS_REVISION}" > "${STAMP_FILE}"
rm -rf "${CDS_OUT_DIR}"
exit 0
else
- echo Did not find prebuilt clang "${PACKAGE_VERSION}", building
+ echo Did not find prebuilt clang at r"${CLANG_REVISION}", building
fi
fi
@@ -287,8 +282,6 @@ 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.
@@ -371,6 +364,349 @@ 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' |
@@ -387,7 +723,6 @@ EOF
patch -p0
popd
-
fi
# Echo all commands.
@@ -640,4 +975,4 @@ if [[ -n "$run_tests" ]]; then
fi
# After everything is done, log success for this revision.
-echo "${PACKAGE_VERSION}" > "${STAMP_FILE}"
+echo "${CLANG_AND_PLUGINS_REVISION}" > "${STAMP_FILE}"