Index: lib/Sema/SemaDecl.cpp =================================================================== --- lib/Sema/SemaDecl.cpp +++ lib/Sema/SemaDecl.cpp @@ -2033,6 +2033,12 @@ if (getLangOpts().Modules || getLangOpts().C11) return; + // Added isImplicit() check, because implicit TypeDecl::getLocation() + // returns 0. The're many implicit typedefs in OpenCL, e.g. atomic_flag. + if (Old->isImplicit() || New->isImplicit()) { + return; + } + // If we have a redefinition of a typedef in C, emit a warning. This warning // is normally mapped to an error, but can be controlled with // -Wtypedef-redefinition. If either the original or the redefinition is Index: test/SemaOpenCL/implicit-typedef.cl =================================================================== --- test/SemaOpenCL/implicit-typedef.cl +++ test/SemaOpenCL/implicit-typedef.cl @@ -0,0 +1,2 @@ +// RUN: %clang_cc1 "-cc1" "-emit-llvm" "-D" "cl_khr_fp64" "-D" "cl_khr_int64_base_atomics" "-fno-dwarf-directory-asm" "-fmessage-length" "205" "-fdiagnostics-show-option" "-cl-std=CL2.0" "-x" "cl" "%s" "-fcolor-diagnostics" -o - +typedef atomic_int atomic_flag; Index: tools/driver/driver.cpp =================================================================== --- tools/driver/driver.cpp +++ tools/driver/driver.cpp @@ -314,14 +314,34 @@ if (llvm::sys::Process::FixupStandardFileDescriptors()) return 1; - SmallVector argv; + SmallVector _argv_; llvm::SpecificBumpPtrAllocator ArgAllocator; std::error_code EC = llvm::sys::Process::GetArgumentVector( - argv, llvm::makeArrayRef(argv_, argc_), ArgAllocator); + _argv_, llvm::makeArrayRef(argv_, argc_), ArgAllocator); if (EC) { llvm::errs() << "error: couldn't get arguments: " << EC.message() << '\n'; return 1; } + +#if defined(_WINDOWS) && defined(_DEBUG) + // Sometimes when debugging in MSVC2015 some parameter(s) may end with "\n". + // The code below code removes wrong symbol. + std::vector argvStorage; + SmallVector argv; + for (int I = 0, Count = _argv_.size(); I < Count; ++I) { + const char* P = _argv_[I]; + size_t PLen = strlen(P); + if (PLen > 0 && P[PLen - 1] == '\n') { + std::string Reduced(P, 0, PLen - 1); + argvStorage.push_back(Reduced); + argv.push_back(argvStorage.back().c_str()); + } else { + argv.push_back(P); + } + } +#else + SmallVector& argv = _argv_; +#endif llvm::InitializeAllTargets(); std::string ProgName = argv[0];