Skip to content
Snippets Groups Projects
Select Git revision
  • 3b687020f5a628a733147c2f71ebdd7e3554e30c
  • inf4_40 default protected
2 results

SemaChecking.cpp

Blame
    • Richard Smith's avatar
      3b687020
      Fix completely bogus types for some builtins: · 3b687020
      Richard Smith authored
       * In C++, never create a FunctionNoProtoType for a builtin (fixes C++1z
         crasher from r289754).
      
       * Fix type of __sync_synchronize to be a no-parameter function rather than a
         varargs function. This matches GCC.
      
       * Fix type of vfprintf to match its actual type. We gave it a wrong type due
         to PR4290 (apparently autoconf generates invalid code and expects compilers
         to choke it down or it miscompiles the program; the relevant error in clang
         was downgraded to a warning in r122744 to fix other occurrences of this
         autoconf brokenness, so we don't need this workaround any more).
      
       * Turn off vararg argument checking for __noop, since it's not *really* a
         varargs function. Alternatively we could add custom type checking for it
         and synthesize parameter types matching the actual arguments in each call,
         but that seemed like overkill.
      
      
      git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@290146 91177308-0d34-0410-b5e6-96231b3b80d8
      3b687020
      History
      Fix completely bogus types for some builtins:
      Richard Smith authored
       * In C++, never create a FunctionNoProtoType for a builtin (fixes C++1z
         crasher from r289754).
      
       * Fix type of __sync_synchronize to be a no-parameter function rather than a
         varargs function. This matches GCC.
      
       * Fix type of vfprintf to match its actual type. We gave it a wrong type due
         to PR4290 (apparently autoconf generates invalid code and expects compilers
         to choke it down or it miscompiles the program; the relevant error in clang
         was downgraded to a warning in r122744 to fix other occurrences of this
         autoconf brokenness, so we don't need this workaround any more).
      
       * Turn off vararg argument checking for __noop, since it's not *really* a
         varargs function. Alternatively we could add custom type checking for it
         and synthesize parameter types matching the actual arguments in each call,
         but that seemed like overkill.
      
      
      git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@290146 91177308-0d34-0410-b5e6-96231b3b80d8
    SemaChecking.cpp 436.85 KiB
    //===--- SemaChecking.cpp - Extra Semantic Checking -----------------------===//
    //
    //                     The LLVM Compiler Infrastructure
    //
    // This file is distributed under the University of Illinois Open Source
    // License. See LICENSE.TXT for details.
    //
    //===----------------------------------------------------------------------===//
    //
    //  This file implements extra semantic analysis beyond what is enforced
    //  by the C type system.
    //
    //===----------------------------------------------------------------------===//
    
    #include "clang/AST/ASTContext.h"
    #include "clang/AST/CharUnits.h"
    #include "clang/AST/DeclCXX.h"
    #include "clang/AST/DeclObjC.h"
    #include "clang/AST/EvaluatedExprVisitor.h"
    #include "clang/AST/Expr.h"
    #include "clang/AST/ExprCXX.h"
    #include "clang/AST/ExprObjC.h"
    #include "clang/AST/ExprOpenMP.h"
    #include "clang/AST/StmtCXX.h"
    #include "clang/AST/StmtObjC.h"
    #include "clang/Analysis/Analyses/FormatString.h"
    #include "clang/Basic/CharInfo.h"
    #include "clang/Basic/TargetBuiltins.h"
    #include "clang/Basic/TargetInfo.h"
    #include "clang/Lex/Lexer.h" // TODO: Extract static functions to fix layering.
    #include "clang/Sema/Initialization.h"
    #include "clang/Sema/Lookup.h"
    #include "clang/Sema/ScopeInfo.h"
    #include "clang/Sema/Sema.h"
    #include "clang/Sema/SemaInternal.h"
    #include "llvm/ADT/STLExtras.h"
    #include "llvm/ADT/SmallBitVector.h"
    #include "llvm/ADT/SmallString.h"
    #include "llvm/Support/ConvertUTF.h"
    #include "llvm/Support/Format.h"
    #include "llvm/Support/Locale.h"
    #include "llvm/Support/raw_ostream.h"
    
    using namespace clang;
    using namespace sema;
    
    SourceLocation Sema::getLocationOfStringLiteralByte(const StringLiteral *SL,
                                                        unsigned ByteNo) const {
      return SL->getLocationOfByte(ByteNo, getSourceManager(), LangOpts,
                                   Context.getTargetInfo());
    }
    
    /// Checks that a call expression's argument count is the desired number.
    /// This is useful when doing custom type-checking.  Returns true on error.
    static bool checkArgCount(Sema &S, CallExpr *call, unsigned desiredArgCount) {
      unsigned argCount = call->getNumArgs();
      if (argCount == desiredArgCount) return false;
    
      if (argCount < desiredArgCount)
        return S.Diag(call->getLocEnd(), diag::err_typecheck_call_too_few_args)
            << 0 /*function call*/ << desiredArgCount << argCount
            << call->getSourceRange();
    
      // Highlight all the excess arguments.
      SourceRange range(call->getArg(desiredArgCount)->getLocStart(),
                        call->getArg(argCount - 1)->getLocEnd());
        
      return S.Diag(range.getBegin(), diag::err_typecheck_call_too_many_args)
        << 0 /*function call*/ << desiredArgCount << argCount
        << call->getArg(1)->getSourceRange();