diff options
Diffstat (limited to 'lib/AST/FormatString.cpp')
| -rw-r--r-- | lib/AST/FormatString.cpp | 41 | 
1 files changed, 27 insertions, 14 deletions
diff --git a/lib/AST/FormatString.cpp b/lib/AST/FormatString.cpp index 04bd48f14a2a0..578d5bc567338 100644 --- a/lib/AST/FormatString.cpp +++ b/lib/AST/FormatString.cpp @@ -1,9 +1,8 @@  // FormatString.cpp - Common stuff for handling printf/scanf formats -*- C++ -*-  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===//  // @@ -224,6 +223,9 @@ clang::analyze_format_string::ParseLengthModifier(FormatSpecifier &FS,        if (I != E && *I == 'h') {          ++I;          lmKind = LengthModifier::AsChar; +      } else if (I != E && *I == 'l' && LO.OpenCL) { +        ++I; +        lmKind = LengthModifier::AsShortLong;        } else {          lmKind = LengthModifier::AsShort;        } @@ -488,7 +490,8 @@ ArgType::matchesType(ASTContext &C, QualType argTy) const {  }  ArgType ArgType::makeVectorType(ASTContext &C, unsigned NumElts) const { -  if (K != SpecificTy) // Won't be a valid vector element type. +  // Check for valid vector element types. +  if (T.isNull())      return ArgType::Invalid();    QualType Vec = C.getExtVectorType(T, NumElts); @@ -573,6 +576,8 @@ analyze_format_string::LengthModifier::toString() const {      return "hh";    case AsShort:      return "h"; +  case AsShortLong: +    return "hl";    case AsLong: // or AsWideChar      return "l";    case AsLongLong: @@ -708,13 +713,18 @@ void OptionalAmount::toString(raw_ostream &os) const {    }  } -bool FormatSpecifier::hasValidLengthModifier(const TargetInfo &Target) const { +bool FormatSpecifier::hasValidLengthModifier(const TargetInfo &Target, +                                             const LangOptions &LO) const {    switch (LM.getKind()) {      case LengthModifier::None:        return true;      // Handle most integer flags      case LengthModifier::AsShort: +      // Length modifier only applies to FP vectors. +      if (LO.OpenCL && CS.isDoubleArg()) +        return !VectorNumElts.isInvalid(); +        if (Target.getTriple().isOSMSVCRT()) {          switch (CS.getKind()) {            case ConversionSpecifier::cArg: @@ -753,8 +763,18 @@ bool FormatSpecifier::hasValidLengthModifier(const TargetInfo &Target) const {            return false;        } +    case LengthModifier::AsShortLong: +      return LO.OpenCL && !VectorNumElts.isInvalid(); +      // Handle 'l' flag      case LengthModifier::AsLong: // or AsWideChar +      if (CS.isDoubleArg()) { +        // Invalid for OpenCL FP scalars. +        if (LO.OpenCL && VectorNumElts.isInvalid()) +          return false; +        return true; +      } +        switch (CS.getKind()) {          case ConversionSpecifier::dArg:          case ConversionSpecifier::DArg: @@ -765,14 +785,6 @@ bool FormatSpecifier::hasValidLengthModifier(const TargetInfo &Target) const {          case ConversionSpecifier::UArg:          case ConversionSpecifier::xArg:          case ConversionSpecifier::XArg: -        case ConversionSpecifier::aArg: -        case ConversionSpecifier::AArg: -        case ConversionSpecifier::fArg: -        case ConversionSpecifier::FArg: -        case ConversionSpecifier::eArg: -        case ConversionSpecifier::EArg: -        case ConversionSpecifier::gArg: -        case ConversionSpecifier::GArg:          case ConversionSpecifier::nArg:          case ConversionSpecifier::cArg:          case ConversionSpecifier::sArg: @@ -879,6 +891,7 @@ bool FormatSpecifier::hasStandardLengthModifier() const {      case LengthModifier::AsInt3264:      case LengthModifier::AsInt64:      case LengthModifier::AsWide: +    case LengthModifier::AsShortLong: // ???        return false;    }    llvm_unreachable("Invalid LengthModifier Kind!");  | 
