diff options
| author | hans <hans@chromium.org> | 2015-03-03 13:09:37 -0800 | 
|---|---|---|
| committer | Commit bot <commit-bot@chromium.org> | 2015-03-03 21:10:09 +0000 | 
| commit | 365c5588df97683350ceabef4d8034c0d3faec78 (patch) | |
| tree | d0e4955efed4abbff13a513c77cc6fc09fdcd191 | |
| parent | 85728971a76208ff2de87d9b5bb625dfd0bd9812 (diff) | |
| download | chromium_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.gypi | 2 | ||||
| -rw-r--r-- | content/gpu/gpu_main.cc | 1 | ||||
| -rw-r--r-- | content/zygote/zygote_main_linux.cc | 1 | ||||
| -rw-r--r-- | sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc | 5 | ||||
| -rw-r--r-- | tools/clang/blink_gc_plugin/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | tools/clang/blink_gc_plugin/Edge.h | 1 | ||||
| -rw-r--r-- | tools/clang/blink_gc_plugin/RecordInfo.h | 1 | ||||
| -rwxr-xr-x | tools/clang/blink_gc_plugin/tests/test.sh | 1 | ||||
| -rwxr-xr-x | tools/clang/scripts/blink_gc_plugin_flags.sh | 5 | ||||
| -rwxr-xr-x | tools/clang/scripts/package.sh | 12 | ||||
| -rwxr-xr-x | tools/clang/scripts/repackage.sh | 67 | ||||
| -rwxr-xr-x | tools/clang/scripts/update.sh | 369 | 
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}" | 
