diff options
43 files changed, 418 insertions, 102 deletions
| diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index b173d82a31d4..1a27e7cd3d2c 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -6972,6 +6972,11 @@ def note_neon_vector_initializer_non_portable_q : Note<    "vcombine_%0%1(vcreate_%0%1(), vcreate_%0%1()) to initialize from integer "    "constants">; +def err_builtin_longjmp_unsupported : Error< +  "__builtin_longjmp is not supported for the current target">; +def err_builtin_setjmp_unsupported : Error< +  "__builtin_setjmp is not supported for the current target">; +  def err_builtin_longjmp_invalid_val : Error<    "argument to __builtin_longjmp must be a constant 1">;  def err_builtin_requires_language : Error<"'%0' is only available in %1">; diff --git a/include/clang/Basic/TargetCXXABI.h b/include/clang/Basic/TargetCXXABI.h index 5669d2a55937..42a976b3afde 100644 --- a/include/clang/Basic/TargetCXXABI.h +++ b/include/clang/Basic/TargetCXXABI.h @@ -79,6 +79,12 @@ public:      ///   - guard variables  are smaller.      GenericAArch64, +    /// The generic Mips ABI is a modified version of the Itanium ABI. +    /// +    /// At the moment, only change from the generic ABI in this case is: +    ///   - representation of member function pointers adjusted as in ARM. +    GenericMIPS, +      /// The Microsoft ABI is the ABI used by Microsoft Visual Studio (and      /// compatible compilers).      /// @@ -114,6 +120,7 @@ public:      case GenericARM:      case iOS:      case iOS64: +    case GenericMIPS:        return true;      case Microsoft: @@ -130,6 +137,7 @@ public:      case GenericARM:      case iOS:      case iOS64: +    case GenericMIPS:        return false;      case Microsoft: @@ -212,6 +220,7 @@ public:      case GenericItanium:      case iOS:   // old iOS compilers did not follow this rule      case Microsoft: +    case GenericMIPS:        return true;      }      llvm_unreachable("bad ABI kind"); @@ -257,6 +266,7 @@ public:      case GenericAArch64:      case GenericARM:      case iOS: +    case GenericMIPS:        return UseTailPaddingUnlessPOD03;      // iOS on ARM64 uses the C++11 POD rules.  It does not honor the diff --git a/include/clang/Basic/TargetInfo.h b/include/clang/Basic/TargetInfo.h index 69a54044680d..7a6462c48227 100644 --- a/include/clang/Basic/TargetInfo.h +++ b/include/clang/Basic/TargetInfo.h @@ -852,6 +852,12 @@ public:      }    } +  /// Controls if __builtin_longjmp / __builtin_setjmp can be lowered to +  /// llvm.eh.sjlj.longjmp / llvm.eh.sjlj.setjmp. +  virtual bool hasSjLjLowering() const { +    return false; +  } +  protected:    virtual uint64_t getPointerWidthV(unsigned AddrSpace) const {      return PointerWidth; diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index bba7c3683498..a364214c11de 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -8550,6 +8550,7 @@ private:    bool SemaBuiltinAssume(CallExpr *TheCall);    bool SemaBuiltinAssumeAligned(CallExpr *TheCall);    bool SemaBuiltinLongjmp(CallExpr *TheCall); +  bool SemaBuiltinSetjmp(CallExpr *TheCall);    ExprResult SemaBuiltinAtomicOverloaded(ExprResult TheCallResult);    ExprResult SemaAtomicOpsOverloaded(ExprResult TheCallResult,                                       AtomicExpr::AtomicOp Op); diff --git a/include/clang/Sema/Template.h b/include/clang/Sema/Template.h index c08a5df00b36..8f0d9da73ecb 100644 --- a/include/clang/Sema/Template.h +++ b/include/clang/Sema/Template.h @@ -273,6 +273,11 @@ namespace clang {      /// outermost scope.      LocalInstantiationScope *cloneScopes(LocalInstantiationScope *Outermost) {        if (this == Outermost) return this; + +      // Save the current scope from SemaRef since the LocalInstantiationScope +      // will overwrite it on construction +      LocalInstantiationScope *oldScope = SemaRef.CurrentInstantiationScope; +        LocalInstantiationScope *newScope =          new LocalInstantiationScope(SemaRef, CombineWithOuterScope); @@ -299,6 +304,8 @@ namespace clang {            newScope->ArgumentPacks.push_back(NewPack);          }        } +      // Restore the saved scope to SemaRef +      SemaRef.CurrentInstantiationScope = oldScope;        return newScope;      } diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 6b864d0f0ac2..c9fb80ceaae2 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -682,6 +682,7 @@ CXXABI *ASTContext::createCXXABI(const TargetInfo &T) {    case TargetCXXABI::iOS:    case TargetCXXABI::iOS64:    case TargetCXXABI::GenericAArch64: +  case TargetCXXABI::GenericMIPS:    case TargetCXXABI::GenericItanium:      return CreateItaniumCXXABI(*this);    case TargetCXXABI::Microsoft: @@ -7873,7 +7874,7 @@ static GVALinkage basicGVALinkageForFunction(const ASTContext &Context,    // Functions specified with extern and inline in -fms-compatibility mode    // forcibly get emitted.  While the body of the function cannot be later    // replaced, the function definition cannot be discarded. -  if (FD->getMostRecentDecl()->isMSExternInline()) +  if (FD->isMSExternInline())      return GVA_StrongODR;    return GVA_DiscardableODR; @@ -8064,6 +8065,7 @@ MangleContext *ASTContext::createMangleContext() {    case TargetCXXABI::GenericAArch64:    case TargetCXXABI::GenericItanium:    case TargetCXXABI::GenericARM: +  case TargetCXXABI::GenericMIPS:    case TargetCXXABI::iOS:    case TargetCXXABI::iOS64:      return ItaniumMangleContext::create(*this, getDiagnostics()); diff --git a/lib/AST/ASTDiagnostic.cpp b/lib/AST/ASTDiagnostic.cpp index 3212359db183..000588face96 100644 --- a/lib/AST/ASTDiagnostic.cpp +++ b/lib/AST/ASTDiagnostic.cpp @@ -998,29 +998,27 @@ class TemplateDiff {              (!HasFromValueDecl && !HasToValueDecl)) &&             "Template argument cannot be both integer and declaration"); -    unsigned ParamWidth = 128; // Safe default -    if (FromDefaultNonTypeDecl->getType()->isIntegralOrEnumerationType()) -      ParamWidth = Context.getIntWidth(FromDefaultNonTypeDecl->getType()); -      if (!HasFromInt && !HasToInt && !HasFromValueDecl && !HasToValueDecl) {        Tree.SetNode(FromExpr, ToExpr);        Tree.SetDefault(FromIter.isEnd() && FromExpr, ToIter.isEnd() && ToExpr);        if (FromDefaultNonTypeDecl->getType()->isIntegralOrEnumerationType()) {          if (FromExpr) -          HasFromInt = GetInt(Context, FromIter, FromExpr, FromInt); +          HasFromInt = GetInt(Context, FromIter, FromExpr, FromInt, +                              FromDefaultNonTypeDecl->getType());          if (ToExpr) -          HasToInt = GetInt(Context, ToIter, ToExpr, ToInt); +          HasToInt = GetInt(Context, ToIter, ToExpr, ToInt, +                            ToDefaultNonTypeDecl->getType());        }        if (HasFromInt && HasToInt) {          Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt); -        Tree.SetSame(IsSameConvertedInt(ParamWidth, FromInt, ToInt)); +        Tree.SetSame(FromInt == ToInt);          Tree.SetKind(DiffTree::Integer);        } else if (HasFromInt || HasToInt) {          Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt);          Tree.SetSame(false);          Tree.SetKind(DiffTree::Integer);        } else { -        Tree.SetSame(IsEqualExpr(Context, ParamWidth, FromExpr, ToExpr) || +        Tree.SetSame(IsEqualExpr(Context, FromExpr, ToExpr) ||                       (FromNullPtr && ToNullPtr));          Tree.SetNullPtr(FromNullPtr, ToNullPtr);          Tree.SetKind(DiffTree::Expression); @@ -1030,11 +1028,17 @@ class TemplateDiff {      if (HasFromInt || HasToInt) {        if (!HasFromInt && FromExpr) -        HasFromInt = GetInt(Context, FromIter, FromExpr, FromInt); +        HasFromInt = GetInt(Context, FromIter, FromExpr, FromInt, +                            FromDefaultNonTypeDecl->getType());        if (!HasToInt && ToExpr) -        HasToInt = GetInt(Context, ToIter, ToExpr, ToInt); +        HasToInt = GetInt(Context, ToIter, ToExpr, ToInt, +                          ToDefaultNonTypeDecl->getType());        Tree.SetNode(FromInt, ToInt, HasFromInt, HasToInt); -      Tree.SetSame(IsSameConvertedInt(ParamWidth, FromInt, ToInt)); +      if (HasFromInt && HasToInt) { +        Tree.SetSame(FromInt == ToInt); +      } else { +        Tree.SetSame(false); +      }        Tree.SetDefault(FromIter.isEnd() && HasFromInt,                        ToIter.isEnd() && HasToInt);        Tree.SetKind(DiffTree::Integer); @@ -1210,9 +1214,11 @@ class TemplateDiff {    }    /// GetInt - Retrieves the template integer argument, including evaluating -  /// default arguments. +  /// default arguments.  If the value comes from an expression, extend the +  /// APSInt to size of IntegerType to match the behavior in +  /// Sema::CheckTemplateArgument    static bool GetInt(ASTContext &Context, const TSTiterator &Iter, -                     Expr *ArgExpr, llvm::APInt &Int) { +                     Expr *ArgExpr, llvm::APSInt &Int, QualType IntegerType) {      // Default, value-depenedent expressions require fetching      // from the desugared TemplateArgument, otherwise expression needs to      // be evaluatable. @@ -1224,12 +1230,14 @@ class TemplateDiff {          case TemplateArgument::Expression:            ArgExpr = Iter.getDesugar().getAsExpr();            Int = ArgExpr->EvaluateKnownConstInt(Context); +          Int = Int.extOrTrunc(Context.getTypeSize(IntegerType));            return true;          default:            llvm_unreachable("Unexpected template argument kind");        }      } else if (ArgExpr->isEvaluatable(Context)) {        Int = ArgExpr->EvaluateKnownConstInt(Context); +      Int = Int.extOrTrunc(Context.getTypeSize(IntegerType));        return true;      } @@ -1302,18 +1310,8 @@ class TemplateDiff {      return nullptr;    } -  /// IsSameConvertedInt - Returns true if both integers are equal when -  /// converted to an integer type with the given width. -  static bool IsSameConvertedInt(unsigned Width, const llvm::APSInt &X, -                                 const llvm::APSInt &Y) { -    llvm::APInt ConvertedX = X.extOrTrunc(Width); -    llvm::APInt ConvertedY = Y.extOrTrunc(Width); -    return ConvertedX == ConvertedY; -  } -    /// IsEqualExpr - Returns true if the expressions evaluate to the same value. -  static bool IsEqualExpr(ASTContext &Context, unsigned ParamWidth, -                          Expr *FromExpr, Expr *ToExpr) { +  static bool IsEqualExpr(ASTContext &Context, Expr *FromExpr, Expr *ToExpr) {      if (FromExpr == ToExpr)        return true; @@ -1345,7 +1343,7 @@ class TemplateDiff {      switch (FromVal.getKind()) {        case APValue::Int: -        return IsSameConvertedInt(ParamWidth, FromVal.getInt(), ToVal.getInt()); +        return FromVal.getInt() == ToVal.getInt();        case APValue::LValue: {          APValue::LValueBase FromBase = FromVal.getLValueBase();          APValue::LValueBase ToBase = ToVal.getLValueBase(); @@ -1655,11 +1653,14 @@ class TemplateDiff {      }      Unbold();    } -   +    /// HasExtraInfo - Returns true if E is not an integer literal or the    /// negation of an integer literal    bool HasExtraInfo(Expr *E) {      if (!E) return false; + +    E = E->IgnoreImpCasts(); +      if (isa<IntegerLiteral>(E)) return false;      if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index e43c28af9b69..dc08d23a24b5 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -2674,7 +2674,8 @@ bool FunctionDecl::isMSExternInline() const {    if (!Context.getLangOpts().MSVCCompat && !hasAttr<DLLExportAttr>())      return false; -  for (const FunctionDecl *FD = this; FD; FD = FD->getPreviousDecl()) +  for (const FunctionDecl *FD = getMostRecentDecl(); FD; +       FD = FD->getPreviousDecl())      if (FD->getStorageClass() == SC_Extern)        return true; diff --git a/lib/Analysis/ThreadSafety.cpp b/lib/Analysis/ThreadSafety.cpp index a986c587f869..f45d6e7ef139 100644 --- a/lib/Analysis/ThreadSafety.cpp +++ b/lib/Analysis/ThreadSafety.cpp @@ -2108,8 +2108,8 @@ void ThreadSafetyAnalyzer::runAnalysis(AnalysisDeclContext &AC) {            // Create a dummy expression,            VarDecl *VD = const_cast<VarDecl*>(AD.getVarDecl()); -          DeclRefExpr DRE(VD, false, VD->getType(), VK_LValue, -                          AD.getTriggerStmt()->getLocEnd()); +          DeclRefExpr DRE(VD, false, VD->getType().getNonReferenceType(), +                          VK_LValue, AD.getTriggerStmt()->getLocEnd());            LocksetBuilder.handleCall(&DRE, DD);            break;          } diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp index 305dcd43960c..118e3f32008b 100644 --- a/lib/Basic/SourceManager.cpp +++ b/lib/Basic/SourceManager.cpp @@ -2076,22 +2076,33 @@ bool SourceManager::isBeforeInTranslationUnit(SourceLocation LHS,      return IsBeforeInTUCache.getCachedResult(LOffs.second, ROffs.second);    } -  // This can happen if a location is in a built-ins buffer. -  // But see PR5662. +  // If we arrived here, the location is either in a built-ins buffer or +  // associated with global inline asm. PR5662 and PR22576 are examples. +    // Clear the lookup cache, it depends on a common location.    IsBeforeInTUCache.clear(); -  bool LIsBuiltins = strcmp("<built-in>", -                            getBuffer(LOffs.first)->getBufferIdentifier()) == 0; -  bool RIsBuiltins = strcmp("<built-in>", -                            getBuffer(ROffs.first)->getBufferIdentifier()) == 0; -  // built-in is before non-built-in -  if (LIsBuiltins != RIsBuiltins) -    return LIsBuiltins; -  assert(LIsBuiltins && RIsBuiltins && -         "Non-built-in locations must be rooted in the main file"); -  // Both are in built-in buffers, but from different files. We just claim that -  // lower IDs come first. -  return LOffs.first < ROffs.first; +  llvm::MemoryBuffer *LBuf = getBuffer(LOffs.first); +  llvm::MemoryBuffer *RBuf = getBuffer(ROffs.first); +  bool LIsBuiltins = strcmp("<built-in>", LBuf->getBufferIdentifier()) == 0; +  bool RIsBuiltins = strcmp("<built-in>", RBuf->getBufferIdentifier()) == 0; +  // Sort built-in before non-built-in. +  if (LIsBuiltins || RIsBuiltins) { +    if (LIsBuiltins != RIsBuiltins) +      return LIsBuiltins; +    // Both are in built-in buffers, but from different files. We just claim that +    // lower IDs come first. +    return LOffs.first < ROffs.first; +  } +  bool LIsAsm = strcmp("<inline asm>", LBuf->getBufferIdentifier()) == 0; +  bool RIsAsm = strcmp("<inline asm>", RBuf->getBufferIdentifier()) == 0; +  // Sort assembler after built-ins, but before the rest. +  if (LIsAsm || RIsAsm) { +    if (LIsAsm != RIsAsm) +      return RIsAsm; +    assert(LOffs.first == ROffs.first); +    return false; +  } +  llvm_unreachable("Unsortable locations found");  }  void SourceManager::PrintStats() const { diff --git a/lib/Basic/TargetInfo.cpp b/lib/Basic/TargetInfo.cpp index 6987cd71f3d7..871bbd5ef43f 100644 --- a/lib/Basic/TargetInfo.cpp +++ b/lib/Basic/TargetInfo.cpp @@ -655,6 +655,7 @@ bool TargetCXXABI::tryParse(llvm::StringRef name) {      .Case("ios", iOS)      .Case("itanium", GenericItanium)      .Case("microsoft", Microsoft) +    .Case("mips", GenericMIPS)      .Default(unknown);    if (kind == unknown) return false; diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index bf60bbf3fd9f..a7a00570d127 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -419,6 +419,7 @@ protected:  public:    NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {      this->UserLabelPrefix = ""; +    this->MCountName = "_mcount";    }  }; @@ -919,6 +920,10 @@ public:      if (RegNo == 1) return 4;      return -1;    } + +  bool hasSjLjLowering() const override { +    return true; +  }  };  const Builtin::Info PPCTargetInfo::BuiltinInfo[] = { @@ -2181,6 +2186,10 @@ public:    CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {      return MT == CCMT_Member ? CC_X86ThisCall : CC_C;    } + +  bool hasSjLjLowering() const override { +    return true; +  }  };  bool X86TargetInfo::setFPMath(StringRef Name) { @@ -3354,7 +3363,10 @@ public:        : WindowsTargetInfo<X86_32TargetInfo>(Triple) {      WCharType = UnsignedShort;      DoubleAlign = LongLongAlign = 64; -    DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32"; +    bool IsWinCOFF = +        getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF(); +    DescriptionString = IsWinCOFF ? "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32" +                                  : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-S32";    }    void getTargetDefines(const LangOptions &Opts,                          MacroBuilder &Builder) const override { @@ -5628,7 +5640,9 @@ public:                       const std::string &CPUStr)        : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),          IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat), -        DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {} +        DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) { +    TheCXXABI.set(TargetCXXABI::GenericMIPS); +  }    bool isNaN2008Default() const {      return CPU == "mips32r6" || CPU == "mips64r6"; @@ -6662,6 +6676,8 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {      switch (os) {      case llvm::Triple::Linux:        return new LinuxTargetInfo<PPC64TargetInfo>(Triple); +    case llvm::Triple::NetBSD: +      return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);      default:        return new PPC64TargetInfo(Triple);      } diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 9f4567dbbb84..d653130df3d0 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -64,6 +64,7 @@ static CGCXXABI *createCXXABI(CodeGenModule &CGM) {    case TargetCXXABI::GenericARM:    case TargetCXXABI::iOS:    case TargetCXXABI::iOS64: +  case TargetCXXABI::GenericMIPS:    case TargetCXXABI::GenericItanium:      return CreateItaniumCXXABI(CGM);    case TargetCXXABI::Microsoft: diff --git a/lib/CodeGen/ItaniumCXXABI.cpp b/lib/CodeGen/ItaniumCXXABI.cpp index deebab858399..9e88b1ebbadc 100644 --- a/lib/CodeGen/ItaniumCXXABI.cpp +++ b/lib/CodeGen/ItaniumCXXABI.cpp @@ -339,6 +339,9 @@ CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {      return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true,                               /* UseARMGuardVarABI = */ true); +  case TargetCXXABI::GenericMIPS: +    return new ItaniumCXXABI(CGM, /* UseARMMethodPtrABI = */ true); +    case TargetCXXABI::GenericItanium:      if (CGM.getContext().getTargetInfo().getTriple().getArch()          == llvm::Triple::le32) { diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 39cc7e5d99c4..c05b23a32e86 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -664,7 +664,6 @@ public:                     ('T' << 24);      return llvm::ConstantInt::get(CGM.Int32Ty, Sig);    } -  };  } @@ -4455,7 +4454,6 @@ public:                                                llvm::AttributeSet::FunctionIndex,                                                B));    } -  };  } diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index f789fd55598f..8bd8298031f5 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -1724,6 +1724,7 @@ static bool findMIPSMultilibs(const llvm::Triple &TargetTriple, StringRef Path,    MultilibSet AndroidMipsMultilibs = MultilibSet()      .Maybe(Multilib("/mips-r2").flag("+march=mips32r2")) +    .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))      .FilterOut(NonExistent);    MultilibSet DebianMipsMultilibs; @@ -1783,6 +1784,7 @@ static bool findMIPSMultilibs(const llvm::Triple &TargetTriple, StringRef Path,    addMultilibFlag(isMips16(Args), "mips16", Flags);    addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);    addMultilibFlag(CPUName == "mips32r2", "march=mips32r2", Flags); +  addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);    addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);    addMultilibFlag(CPUName == "mips64r2" || CPUName == "octeon",                    "march=mips64r2", Flags); diff --git a/lib/Frontend/InitPreprocessor.cpp b/lib/Frontend/InitPreprocessor.cpp index f4241a94ae02..3550ac25159b 100644 --- a/lib/Frontend/InitPreprocessor.cpp +++ b/lib/Frontend/InitPreprocessor.cpp @@ -662,12 +662,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,                     TI.getTypeWidth(TI.getWCharType()), TI, Builder);    DefineTypeSizeof("__SIZEOF_WINT_T__",                     TI.getTypeWidth(TI.getWIntType()), TI, Builder); -  // This is a temporary workaround while MIPS64 has not yet fully supported -  // 128-bit integers. But declaration of int128 type is necessary even though -  // __SIZEOF_INT128__ is undefined because c++ standard header files like -  // limits throw error message if __int128 is not available. -  if (TI.hasInt128Type() && !(TI.getTriple().getArch() == llvm::Triple::mips64el -                   || TI.getTriple().getArch() == llvm::Triple::mips64)) +  if (TI.hasInt128Type())      DefineTypeSizeof("__SIZEOF_INT128__", 128, TI, Builder);    DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Builder); diff --git a/lib/Sema/DeclSpec.cpp b/lib/Sema/DeclSpec.cpp index 7bf3e51999b6..349bb3258025 100644 --- a/lib/Sema/DeclSpec.cpp +++ b/lib/Sema/DeclSpec.cpp @@ -345,8 +345,9 @@ bool Declarator::isDeclarationOfFunction() const {  bool Declarator::isStaticMember() {    assert(getContext() == MemberContext);    return getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static || -         CXXMethodDecl::isStaticOverloadedOperator( -             getName().OperatorFunctionId.Operator); +         (getName().Kind == UnqualifiedId::IK_OperatorFunctionId && +          CXXMethodDecl::isStaticOverloadedOperator( +              getName().OperatorFunctionId.Operator));  }  bool DeclSpec::hasTagDefinition() const { diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index fdc136ccbd23..8c3efdee9036 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -297,6 +297,10 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,      if (SemaBuiltinLongjmp(TheCall))        return ExprError();      break; +  case Builtin::BI__builtin_setjmp: +    if (SemaBuiltinSetjmp(TheCall)) +      return ExprError(); +    break;    case Builtin::BI__builtin_classify_type:      if (checkArgCount(*this, TheCall, 1)) return true; @@ -2367,8 +2371,13 @@ bool Sema::SemaBuiltinConstantArgRange(CallExpr *TheCall, int ArgNum,  }  /// SemaBuiltinLongjmp - Handle __builtin_longjmp(void *env[5], int val). -/// This checks that val is a constant 1. +/// This checks that the target supports __builtin_longjmp and +/// that val is a constant 1.  bool Sema::SemaBuiltinLongjmp(CallExpr *TheCall) { +  if (!Context.getTargetInfo().hasSjLjLowering()) +    return Diag(TheCall->getLocStart(), diag::err_builtin_longjmp_unsupported) +             << SourceRange(TheCall->getLocStart(), TheCall->getLocEnd()); +    Expr *Arg = TheCall->getArg(1);    llvm::APSInt Result; @@ -2383,6 +2392,16 @@ bool Sema::SemaBuiltinLongjmp(CallExpr *TheCall) {    return false;  } + +/// SemaBuiltinSetjmp - Handle __builtin_setjmp(void *env[5]). +/// This checks that the target supports __builtin_setjmp. +bool Sema::SemaBuiltinSetjmp(CallExpr *TheCall) { +  if (!Context.getTargetInfo().hasSjLjLowering()) +    return Diag(TheCall->getLocStart(), diag::err_builtin_setjmp_unsupported) +             << SourceRange(TheCall->getLocStart(), TheCall->getLocEnd()); +  return false; +} +  namespace {  enum StringLiteralCheckType {    SLCT_NotALiteral, diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 091fd27db85d..8be11572b2e0 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -117,7 +117,7 @@ static AvailabilityResult DiagnoseAvailabilityOfDecl(Sema &S,      case AR_Available:      case AR_NotYetIntroduced:        break; -             +      case AR_Deprecated:        if (S.getCurContextAvailability() != AR_Deprecated)          S.EmitAvailabilityWarning(Sema::AD_Deprecation, @@ -11630,8 +11630,11 @@ void Sema::MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func,    } else if (CXXDestructorDecl *Destructor =                   dyn_cast<CXXDestructorDecl>(Func)) {      Destructor = cast<CXXDestructorDecl>(Destructor->getFirstDecl()); -    if (Destructor->isDefaulted() && !Destructor->isDeleted()) +    if (Destructor->isDefaulted() && !Destructor->isDeleted()) { +      if (Destructor->isTrivial() && !Destructor->hasAttr<DLLExportAttr>()) +        return;        DefineImplicitDestructor(Loc, Destructor); +    }      if (Destructor->isVirtual())        MarkVTableUsed(Loc, Destructor->getParent());    } else if (CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(Func)) { diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 3e2a2de5b406..a92b7ac472e7 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -5705,6 +5705,16 @@ ExprResult Sema::BuildCXXMemberCallExpr(Expr *E, NamedDecl *FoundDecl,  ExprResult Sema::BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand,                                        SourceLocation RParen) { +  // If the operand is an unresolved lookup expression, the expression is ill- +  // formed per [over.over]p1, because overloaded function names cannot be used +  // without arguments except in explicit contexts. +  ExprResult R = CheckPlaceholderExpr(Operand); +  if (R.isInvalid()) +    return R; + +  // The operand may have been modified when checking the placeholder type. +  Operand = R.get(); +    if (ActiveTemplateInstantiations.empty() &&        Operand->HasSideEffects(Context, false)) {      // The expression operand for noexcept is in an unevaluated expression diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index 67c36a5fb5e9..1e7176222b57 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -3355,7 +3355,7 @@ Sema::SubstDefaultTemplateArgumentIfAvailable(TemplateDecl *Template,  /// \param Param The template parameter against which the argument will be  /// checked.  /// -/// \param Arg The template argument. +/// \param Arg The template argument, which may be updated due to conversions.  ///  /// \param Template The template in which the template argument resides.  /// @@ -3433,6 +3433,13 @@ bool Sema::CheckTemplateArgument(NamedDecl *Param,        if (Res.isInvalid())          return true; +      // If the resulting expression is new, then use it in place of the +      // old expression in the template argument. +      if (Res.get() != Arg.getArgument().getAsExpr()) { +        TemplateArgument TA(Res.get()); +        Arg = TemplateArgumentLoc(TA, Res.get()); +      } +        Converted.push_back(Result);        break;      } @@ -3640,9 +3647,14 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,                                       TemplateArgumentListInfo &TemplateArgs,                                       bool PartialTemplateArgs,                            SmallVectorImpl<TemplateArgument> &Converted) { +  // Make a copy of the template arguments for processing.  Only make the +  // changes at the end when successful in matching the arguments to the +  // template. +  TemplateArgumentListInfo NewArgs = TemplateArgs; +    TemplateParameterList *Params = Template->getTemplateParameters(); -  SourceLocation RAngleLoc = TemplateArgs.getRAngleLoc(); +  SourceLocation RAngleLoc = NewArgs.getRAngleLoc();    // C++ [temp.arg]p1:    //   [...] The type and form of each template-argument specified in @@ -3651,7 +3663,7 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,    //   template-parameter-list.    bool isTemplateTemplateParameter = isa<TemplateTemplateParmDecl>(Template);    SmallVector<TemplateArgument, 2> ArgumentPack; -  unsigned ArgIdx = 0, NumArgs = TemplateArgs.size(); +  unsigned ArgIdx = 0, NumArgs = NewArgs.size();    LocalInstantiationScope InstScope(*this, true);    for (TemplateParameterList::iterator Param = Params->begin(),                                         ParamEnd = Params->end(); @@ -3687,21 +3699,21 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,      if (ArgIdx < NumArgs) {        // Check the template argument we were given. -      if (CheckTemplateArgument(*Param, TemplateArgs[ArgIdx], Template, +      if (CheckTemplateArgument(*Param, NewArgs[ArgIdx], Template,                                  TemplateLoc, RAngleLoc,                                  ArgumentPack.size(), Converted))          return true;        bool PackExpansionIntoNonPack = -          TemplateArgs[ArgIdx].getArgument().isPackExpansion() && +          NewArgs[ArgIdx].getArgument().isPackExpansion() &&            (!(*Param)->isTemplateParameterPack() || getExpandedPackSize(*Param));        if (PackExpansionIntoNonPack && isa<TypeAliasTemplateDecl>(Template)) {          // Core issue 1430: we have a pack expansion as an argument to an          // alias template, and it's not part of a parameter pack. This          // can't be canonicalized, so reject it now. -        Diag(TemplateArgs[ArgIdx].getLocation(), +        Diag(NewArgs[ArgIdx].getLocation(),               diag::err_alias_template_expansion_into_fixed_list) -          << TemplateArgs[ArgIdx].getSourceRange(); +          << NewArgs[ArgIdx].getSourceRange();          Diag((*Param)->getLocation(), diag::note_template_param_here);          return true;        } @@ -3733,7 +3745,7 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,          }          while (ArgIdx < NumArgs) { -          Converted.push_back(TemplateArgs[ArgIdx].getArgument()); +          Converted.push_back(NewArgs[ArgIdx].getArgument());            ++ArgIdx;          } @@ -3784,8 +3796,7 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,      // the default argument.      if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) {        if (!TTP->hasDefaultArgument()) -        return diagnoseArityMismatch(*this, Template, TemplateLoc,  -                                     TemplateArgs); +        return diagnoseArityMismatch(*this, Template, TemplateLoc, NewArgs);        TypeSourceInfo *ArgType = SubstDefaultTemplateArgument(*this,                                                               Template, @@ -3801,8 +3812,7 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,      } else if (NonTypeTemplateParmDecl *NTTP                   = dyn_cast<NonTypeTemplateParmDecl>(*Param)) {        if (!NTTP->hasDefaultArgument()) -        return diagnoseArityMismatch(*this, Template, TemplateLoc,  -                                     TemplateArgs); +        return diagnoseArityMismatch(*this, Template, TemplateLoc, NewArgs);        ExprResult E = SubstDefaultTemplateArgument(*this, Template,                                                                TemplateLoc, @@ -3819,8 +3829,7 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,          = cast<TemplateTemplateParmDecl>(*Param);        if (!TempParm->hasDefaultArgument()) -        return diagnoseArityMismatch(*this, Template, TemplateLoc,  -                                     TemplateArgs); +        return diagnoseArityMismatch(*this, Template, TemplateLoc, NewArgs);        NestedNameSpecifierLoc QualifierLoc;        TemplateName Name = SubstDefaultTemplateArgument(*this, Template, @@ -3848,12 +3857,12 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,                                RAngleLoc, 0, Converted))        return true; -    // Core issue 150 (assumed resolution): if this is a template template  -    // parameter, keep track of the default template arguments from the  +    // Core issue 150 (assumed resolution): if this is a template template +    // parameter, keep track of the default template arguments from the      // template definition.      if (isTemplateTemplateParameter) -      TemplateArgs.addArgument(Arg); -     +      NewArgs.addArgument(Arg); +      // Move to the next template parameter and argument.      ++Param;      ++ArgIdx; @@ -3865,15 +3874,18 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,    // still dependent).    if (ArgIdx < NumArgs && CurrentInstantiationScope &&        CurrentInstantiationScope->getPartiallySubstitutedPack()) { -    while (ArgIdx < NumArgs && -           TemplateArgs[ArgIdx].getArgument().isPackExpansion()) -      Converted.push_back(TemplateArgs[ArgIdx++].getArgument()); +    while (ArgIdx < NumArgs && NewArgs[ArgIdx].getArgument().isPackExpansion()) +      Converted.push_back(NewArgs[ArgIdx++].getArgument());    }    // If we have any leftover arguments, then there were too many arguments.    // Complain and fail.    if (ArgIdx < NumArgs) -    return diagnoseArityMismatch(*this, Template, TemplateLoc, TemplateArgs); +    return diagnoseArityMismatch(*this, Template, TemplateLoc, NewArgs); + +  // No problems found with the new argument list, propagate changes back +  // to caller. +  TemplateArgs = NewArgs;    return false;  } diff --git a/test/CodeGen/2003-08-06-BuiltinSetjmpLongjmp.c b/test/CodeGen/2003-08-06-BuiltinSetjmpLongjmp.c deleted file mode 100644 index 3aa5c003973f..000000000000 --- a/test/CodeGen/2003-08-06-BuiltinSetjmpLongjmp.c +++ /dev/null @@ -1,15 +0,0 @@ -/* RUN: %clang_cc1  %s -emit-llvm -o - | FileCheck %s - * - * __builtin_longjmp/setjmp should get transformed into intrinsics. - */ - -// CHECK-NOT: builtin_longjmp - -void jumpaway(int *ptr) { -  __builtin_longjmp(ptr,1); -} -     -int main(void) { -  __builtin_setjmp(0); -  jumpaway(0); -} diff --git a/test/CodeGen/builtins.c b/test/CodeGen/builtins.c index 1ab29a659b31..bf7874b08862 100644 --- a/test/CodeGen/builtins.c +++ b/test/CodeGen/builtins.c @@ -220,6 +220,8 @@ void test_float_builtin_ops(float F, double D, long double LD) {    // CHECK: call x86_fp80 @llvm.fabs.f80(x86_fp80  } +// __builtin_longjmp isn't supported on all platforms, so only test it on X86. +#ifdef __x86_64__  // CHECK-LABEL: define void @test_builtin_longjmp  void test_builtin_longjmp(void **buffer) {    // CHECK: [[BITCAST:%.*]] = bitcast @@ -227,6 +229,7 @@ void test_builtin_longjmp(void **buffer) {    __builtin_longjmp(buffer, 1);    // CHECK-NEXT: unreachable  } +#endif  // CHECK-LABEL: define i64 @test_builtin_readcyclecounter  long long test_builtin_readcyclecounter() { diff --git a/test/CodeGen/invalid_global_asm.c b/test/CodeGen/invalid_global_asm.c new file mode 100644 index 000000000000..5b7e8b43d752 --- /dev/null +++ b/test/CodeGen/invalid_global_asm.c @@ -0,0 +1,5 @@ +// REQUIRES: arm-registered-target +// RUN: not %clang_cc1 -emit-obj -triple armv6-unknown-unknown -o %t %s 2>&1 | FileCheck %s +#pragma clang diagnostic ignored "-Wmissing-noreturn" +__asm__(".Lfoo: movw r2, #:lower16:.Lbar - .Lfoo"); +// CHECK: <inline asm>:1:8: error: instruction requires: armv6t2 diff --git a/test/CodeGen/mangle-windows.c b/test/CodeGen/mangle-windows.c index 4a108751aa4b..594dbf09e9fa 100644 --- a/test/CodeGen/mangle-windows.c +++ b/test/CodeGen/mangle-windows.c @@ -1,15 +1,26 @@  // RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s  // RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-mingw32 | FileCheck %s +// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-windows-msvc-elf | FileCheck %s --check-prefix=ELF32  // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-pc-win32 | FileCheck %s --check-prefix=X64  // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-mingw32 | FileCheck %s --check-prefix=X64 +// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-pc-windows-msvc-elf | FileCheck %s --check-prefix=ELF64 + +// CHECK: target datalayout = "e-m:w-{{.*}}" +// X64: target datalayout = "e-m:e-{{.*}}" +// ELF32: target datalayout = "e-m:e-{{.*}}" +// ELF64: target datalayout = "e-m:e-{{.*}}"  void __stdcall f1(void) {}  // CHECK: define x86_stdcallcc void @"\01_f1@0"  // X64: define void @f1( +// ELF32: define x86_stdcallcc void @"\01_f1@0" +// ELF64: define void @f1(  void __fastcall f2(void) {}  // CHECK: define x86_fastcallcc void @"\01@f2@0"  // X64: define void @f2( +// ELF32: define x86_fastcallcc void @"\01@f2@0" +// ELF64: define void @f2(  void __stdcall f3() {}  // CHECK: define x86_stdcallcc void @"\01_f3@0" @@ -46,10 +57,14 @@ void f12(void) {}  void __vectorcall v1(void) {}  // CHECK: define x86_vectorcallcc void @"\01v1@@0"(  // X64: define x86_vectorcallcc void @"\01v1@@0"( +// ELF32: define x86_vectorcallcc void @"\01v1@@0"( +// ELF64: define x86_vectorcallcc void @"\01v1@@0"(  void __vectorcall v2(char a) {}  // CHECK: define x86_vectorcallcc void @"\01v2@@4"(  // X64: define x86_vectorcallcc void @"\01v2@@8"( +// ELF32: define x86_vectorcallcc void @"\01v2@@4"( +// ELF64: define x86_vectorcallcc void @"\01v2@@8"(  void __vectorcall v3(short a) {}  // CHECK: define x86_vectorcallcc void @"\01v3@@4"( diff --git a/test/CodeGen/mcount.c b/test/CodeGen/mcount.c index 5c608bcd3657..99dc90795b5e 100644 --- a/test/CodeGen/mcount.c +++ b/test/CodeGen/mcount.c @@ -1,8 +1,18 @@  // RUN: %clang_cc1 -pg -triple i386-unknown-unknown -emit-llvm -o - %s | FileCheck %s -// RUN: %clang_cc1 -pg -triple powerpc-unknown-gnu-linux -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PPC %s -// RUN: %clang_cc1 -pg -triple powerpc64-unknown-gnu-linux -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PPC %s -// RUN: %clang_cc1 -pg -triple powerpc64le-unknown-gnu-linux -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PPC %s +// RUN: %clang_cc1 -pg -triple powerpc-unknown-gnu-linux -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s +// RUN: %clang_cc1 -pg -triple powerpc64-unknown-gnu-linux -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s +// RUN: %clang_cc1 -pg -triple powerpc64le-unknown-gnu-linux -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s +// RUN: %clang_cc1 -pg -triple i386-netbsd -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s +// RUN: %clang_cc1 -pg -triple x86_64-netbsd -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s +// RUN: %clang_cc1 -pg -triple arm-netbsd-eabi -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s +// RUN: %clang_cc1 -pg -triple aarch64-netbsd -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s +// RUN: %clang_cc1 -pg -triple mips-netbsd -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s +// RUN: %clang_cc1 -pg -triple powerpc-netbsd -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s +// RUN: %clang_cc1 -pg -triple powerpc64-netbsd -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s +// RUN: %clang_cc1 -pg -triple powerpc64le-netbsd -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s +// RUN: %clang_cc1 -pg -triple sparc-netbsd -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s +// RUN: %clang_cc1 -pg -triple sparc64-netbsd -emit-llvm -o - %s | FileCheck -check-prefix=CHECK-PREFIXED %s  void foo(void) {  // CHECK: call void @mcount() -// CHECK-PPC: call void @_mcount() +// CHECK-PREFIXED: call void @_mcount()  } diff --git a/test/CodeGenCXX/inline-functions.cpp b/test/CodeGenCXX/inline-functions.cpp index 622cfa9536f3..20da1f631809 100644 --- a/test/CodeGenCXX/inline-functions.cpp +++ b/test/CodeGenCXX/inline-functions.cpp @@ -121,3 +121,18 @@ struct TypeWithInlineMethods {    // CHECK-NOT: _ZN21TypeWithInlineMethods12NonStaticFunEv    void NonStaticFun() { StaticFun(); }  }; + +namespace PR22959 { +template <typename> +struct S; + +S<int> Foo(); + +template <typename> +struct S { +  friend S<int> Foo(); +}; + +__attribute__((used)) inline S<int> Foo() { return S<int>(); } +// CHECK-LABEL: define linkonce_odr void @_ZN7PR229593FooEv( +} diff --git a/test/CodeGenCXX/member-function-pointers.cpp b/test/CodeGenCXX/member-function-pointers.cpp index fb06fa77039d..8ae57b2cdb6a 100644 --- a/test/CodeGenCXX/member-function-pointers.cpp +++ b/test/CodeGenCXX/member-function-pointers.cpp @@ -6,6 +6,8 @@  // PNaCl uses the same representation of method pointers as ARM.  // RUN: %clang_cc1 %s -emit-llvm -o - -triple=le32-unknown-nacl | FileCheck -check-prefix GLOBAL-ARM %s +// MIPS uses the same representation of method pointers as ARM. +// RUN: %clang_cc1 %s -emit-llvm -o - -triple=mips-unknown-linux-gnu | FileCheck -check-prefix GLOBAL-ARM %s  struct A { int a; void f(); virtual void vf1(); virtual void vf2(); };  struct B { int b; virtual void g(); }; diff --git a/test/CodeGenCXX/trivial-constructor-init.cpp b/test/CodeGenCXX/trivial-constructor-init.cpp index 9130e4e5d959..da17799dfa42 100644 --- a/test/CodeGenCXX/trivial-constructor-init.cpp +++ b/test/CodeGenCXX/trivial-constructor-init.cpp @@ -32,3 +32,17 @@ static C c[4];  int main() {  } + +namespace PR22793 { +template <typename> +struct foo { +protected: +// CHECK-NOT: _ZN7PR227933fooIiED2Ev +  ~foo() = default; +  friend void func(); +}; + +void func() { foo<int> f; } + +template struct foo<int>; +} diff --git a/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtbegin.o b/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtbegin.o new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtbegin.o diff --git a/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtbeginS.o b/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtbeginS.o new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtbeginS.o diff --git a/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtbeginT.o b/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtbeginT.o new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtbeginT.o diff --git a/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtend.o b/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtend.o new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtend.o diff --git a/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtendS.o b/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtendS.o new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/test/Driver/Inputs/basic_android_tree/lib/gcc/mipsel-linux-android/4.4.3/mips-r6/crtendS.o diff --git a/test/Driver/android-standalone.cpp b/test/Driver/android-standalone.cpp index 2bdaeddcdbd4..d563debdf40a 100644 --- a/test/Driver/android-standalone.cpp +++ b/test/Driver/android-standalone.cpp @@ -93,3 +93,19 @@  // CHECK-MIPSR2-A: "-L{{.*}}/lib/gcc/mipsel-linux-android/4.4.3/mips-r2"  // CHECK-MIPSR2-A: "-L{{.*}}/lib/gcc/mipsel-linux-android/4.4.3/../../../../mipsel-linux-android/lib"  // CHECK-MIPSR2-A: "-L{{.*}}/sysroot/usr/lib" +// +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN:     -target mipsel-linux-android \ +// RUN:     -mips32r6 \ +// RUN:     -B%S/Inputs/basic_android_tree \ +// RUN:     --sysroot=%S/Inputs/basic_android_tree/sysroot \ +// RUN:   | FileCheck --check-prefix=CHECK-MIPSR6 %s +// CHECK-MIPSR6: {{.*}}clang{{.*}}" "-cc1" +// CHECK-MIPSR6: "-internal-isystem" "{{.*}}/mipsel-linux-android/include/c++/4.4.3" +// CHECK-MIPSR6: "-internal-isystem" "{{.*}}/mipsel-linux-android/include/c++/4.4.3/mipsel-linux-android" +// CHECK-MIPSR6: "-internal-externc-isystem" "{{.*}}/sysroot/include" +// CHECK-MIPSR6: "-internal-externc-isystem" "{{.*}}/sysroot/usr/include" +// CHECK-MIPSR6: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-MIPSR6: "-L{{.*}}/lib/gcc/mipsel-linux-android/4.4.3/mips-r6" +// CHECK-MIPSR6: "-L{{.*}}/lib/gcc/mipsel-linux-android/4.4.3/../../../../mipsel-linux-android/lib" +// CHECK-MIPSR6: "-L{{.*}}/sysroot/usr/lib" diff --git a/test/Misc/diag-template-diffing.cpp b/test/Misc/diag-template-diffing.cpp index bdd6d62fdda2..0f2edfb63546 100644 --- a/test/Misc/diag-template-diffing.cpp +++ b/test/Misc/diag-template-diffing.cpp @@ -1247,6 +1247,33 @@ template <class T> using A7 = A<(T::num)>;  // CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('A<(T::num), (default) 0>' vs 'A<T::num, 1>')  } +namespace TemplateArgumentImplicitConversion { +template <int X> struct condition {}; + +struct is_const { +    constexpr operator int() const { return 10; } +}; + +using T = condition<(is_const())>; +void foo(const T &t) { +  T &t2 = t; +} +// CHECK-ELIDE-NOTREE: binding of reference to type 'condition<[...]>' to a value of type 'const condition<[...]>' drops qualifiers +} + +namespace BoolArgumentBitExtended { +template <bool B> struct BoolT {}; + +template <typename T> void foo(T) {} + +void test() { +  BoolT<false> X; +  foo<BoolT<true>>(X); +} +// CHECK-ELIDE-NOTREE: no matching function for call to 'foo' +// CHECK-ELIDE-NOTREE: candidate function [with T = BoolArgumentBitExtended::BoolT<true>] not viable: no known conversion from 'BoolT<0>' to 'BoolT<1>' for 1st argument +} +  // CHECK-ELIDE-NOTREE: {{[0-9]*}} errors generated.  // CHECK-NOELIDE-NOTREE: {{[0-9]*}} errors generated.  // CHECK-ELIDE-TREE: {{[0-9]*}} errors generated. diff --git a/test/Preprocessor/init.c b/test/Preprocessor/init.c index f3a1ba5d6781..1502e78b4dcd 100644 --- a/test/Preprocessor/init.c +++ b/test/Preprocessor/init.c @@ -3752,7 +3752,7 @@  // MIPS64BE:#define __SIG_ATOMIC_WIDTH__ 32  // MIPS64BE:#define __SIZEOF_DOUBLE__ 8  // MIPS64BE:#define __SIZEOF_FLOAT__ 4 -// MIPS64BE-NOT:#define __SIZEOF_INT128__ 16 +// MIPS64BE:#define __SIZEOF_INT128__ 16  // MIPS64BE:#define __SIZEOF_INT__ 4  // MIPS64BE:#define __SIZEOF_LONG_DOUBLE__ 16  // MIPS64BE:#define __SIZEOF_LONG_LONG__ 8 @@ -3960,7 +3960,7 @@  // MIPS64EL:#define __SIG_ATOMIC_WIDTH__ 32  // MIPS64EL:#define __SIZEOF_DOUBLE__ 8  // MIPS64EL:#define __SIZEOF_FLOAT__ 4 -// MIPS64EL-NOT:#define __SIZEOF_INT128__ 16 +// MIPS64EL:#define __SIZEOF_INT128__ 16  // MIPS64EL:#define __SIZEOF_INT__ 4  // MIPS64EL:#define __SIZEOF_LONG_DOUBLE__ 16  // MIPS64EL:#define __SIZEOF_LONG_LONG__ 8 diff --git a/test/Sema/builtin-longjmp.c b/test/Sema/builtin-longjmp.c new file mode 100644 index 000000000000..5ed393e591c9 --- /dev/null +++ b/test/Sema/builtin-longjmp.c @@ -0,0 +1,34 @@ +// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm < %s| FileCheck %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm < %s| FileCheck %s +// RUN: %clang_cc1 -triple x86_64-windows -emit-llvm < %s| FileCheck %s +// RUN: %clang_cc1 -triple powerpc-unknown-unknown -emit-llvm < %s| FileCheck %s +// RUN: %clang_cc1 -triple powerpc64-unknown-unknown -emit-llvm < %s| FileCheck %s + +// RUN: %clang_cc1 -triple arm-unknown-unknown -emit-llvm-only -verify %s +// RUN: %clang_cc1 -triple aarch64-unknown-unknown -emit-llvm-only -verify %s +// RUN: %clang_cc1 -triple mips-unknown-unknown -emit-llvm-only -verify %s +// RUN: %clang_cc1 -triple mips64-unknown-unknown -emit-llvm-only -verify %s + +// Check that __builtin_longjmp and __builtin_setjmp are lowered into +// IR intrinsics on those architectures that can handle them. +// Check that an error is created otherwise. + +typedef void *jmp_buf; +jmp_buf buf; + +// CHECK:   define{{.*}} void @do_jump() +// CHECK:   call{{.*}} void @llvm.eh.sjlj.longjmp + +// CHECK:   define{{.*}} void @do_setjmp() +// CHECK:   call{{.*}} i32 @llvm.eh.sjlj.setjmp + +void do_jump(void) { +  __builtin_longjmp(buf, 1); // expected-error {{__builtin_longjmp is not supported for the current target}} +} + +void f(void); + +void do_setjmp(void) { +  if (!__builtin_setjmp(buf)) // expected-error {{__builtin_setjmp is not supported for the current target}} +    f(); +} diff --git a/test/SemaCXX/cxx0x-noexcept-expression.cpp b/test/SemaCXX/cxx0x-noexcept-expression.cpp new file mode 100644 index 000000000000..f1fe01a845fd --- /dev/null +++ b/test/SemaCXX/cxx0x-noexcept-expression.cpp @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s + +void f(); // expected-note {{possible target for call}} +void f(int); // expected-note {{possible target for call}} + +void g() { +  bool b = noexcept(f); // expected-error {{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}} +  bool b2 = noexcept(f(0)); +} + +struct S { +  void g(); // expected-note {{possible target for call}} +  void g(int); // expected-note {{possible target for call}} + +  void h() { +    bool b = noexcept(this->g); // expected-error {{reference to non-static member function must be called; did you mean to call it with no arguments?}} +    bool b2 = noexcept(this->g(0)); +  } +}; diff --git a/test/SemaCXX/thread-safety-reference-handling.cpp b/test/SemaCXX/thread-safety-reference-handling.cpp new file mode 100644 index 000000000000..2f7eb48d3436 --- /dev/null +++ b/test/SemaCXX/thread-safety-reference-handling.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wthread-safety-analysis -std=c++11 %s +// expected-no-diagnostics + +class Base { +public: +  Base() {} +  virtual ~Base(); +}; + +class S : public Base { +public: +  ~S() override = default; +}; + +void Test() { +  const S &s = S(); +} diff --git a/test/SemaCXX/warn-thread-safety-negative.cpp b/test/SemaCXX/warn-thread-safety-negative.cpp index f88233a60b27..f831010293b6 100644 --- a/test/SemaCXX/warn-thread-safety-negative.cpp +++ b/test/SemaCXX/warn-thread-safety-negative.cpp @@ -102,3 +102,20 @@ public:  };  }  // end namespace SimpleTest + +namespace DoubleAttribute { + +struct Foo { +  Mutex &mutex(); +}; + +template <typename A> +class TemplateClass { +  template <typename B> +  static void Function(Foo *F) +      EXCLUSIVE_LOCKS_REQUIRED(F->mutex()) UNLOCK_FUNCTION(F->mutex()) {} +}; + +void test() { TemplateClass<int> TC; } + +}  // end namespace DoubleAttribute diff --git a/test/SemaTemplate/overloaded-functions.cpp b/test/SemaTemplate/overloaded-functions.cpp new file mode 100644 index 000000000000..26565753dd73 --- /dev/null +++ b/test/SemaTemplate/overloaded-functions.cpp @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +namespace { +template <bool, typename> +void Foo() {} + +template <int size> +void Foo() { +  int arr[size]; +  // expected-error@-1 {{'arr' declared as an array with a negative size}} +} +} + +void test_foo() { +  Foo<-1>(); +  // expected-note@-1 {{in instantiation of function template specialization '(anonymous namespace)::Foo<-1>' requested here}} +} + +template <bool, typename> +void Bar() {} + +template <int size> +void Bar() { +  int arr[size]; +  // expected-error@-1 {{'arr' declared as an array with a negative size}} +} + +void test_bar() { +  Bar<-1>(); +  // expected-note@-1 {{in instantiation of function template specialization 'Bar<-1>' requested here}} +} + | 
