From: Chris Lattner Date: Fri, 25 Jul 2008 21:45:37 +0000 (+0000) Subject: make sizeof/alignof diagnostics highlight their operand with a sourcerange. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bb280a482bcbb74a10abf1948704a7e51b5f0b4c;p=clang make sizeof/alignof diagnostics highlight their operand with a sourcerange. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54066 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index b87008256a..25120acc7a 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -846,8 +846,8 @@ private: QualType CheckIncrementDecrementOperand(Expr *op, SourceLocation OpLoc); QualType CheckAddressOfOperand(Expr *op, SourceLocation OpLoc); QualType CheckIndirectionOperand(Expr *op, SourceLocation OpLoc); - QualType CheckSizeOfAlignOfOperand(QualType type, SourceLocation loc, - bool isSizeof); + QualType CheckSizeOfAlignOfOperand(QualType type, SourceLocation OpLoc, + const SourceRange &R, bool isSizeof); QualType CheckRealImagOperand(Expr *&Op, SourceLocation OpLoc); /// type checking primary expressions. diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 9ffca0870c..27e4027e68 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -587,17 +587,20 @@ Action::ExprResult Sema::ActOnParenExpr(SourceLocation L, SourceLocation R, /// The UsualUnaryConversions() function is *not* called by this routine. /// See C99 6.3.2.1p[2-4] for more details. QualType Sema::CheckSizeOfAlignOfOperand(QualType exprType, - SourceLocation OpLoc, bool isSizeof) { + SourceLocation OpLoc, + const SourceRange &ExprRange, + bool isSizeof) { // C99 6.5.3.4p1: if (isa(exprType) && isSizeof) // alignof(function) is allowed. - Diag(OpLoc, diag::ext_sizeof_function_type); + Diag(OpLoc, diag::ext_sizeof_function_type, ExprRange); else if (exprType->isVoidType()) - Diag(OpLoc, diag::ext_sizeof_void_type, isSizeof ? "sizeof" : "__alignof"); + Diag(OpLoc, diag::ext_sizeof_void_type, isSizeof ? "sizeof" : "__alignof", + ExprRange); else if (exprType->isIncompleteType()) { Diag(OpLoc, isSizeof ? diag::err_sizeof_incomplete_type : diag::err_alignof_incomplete_type, - exprType.getAsString()); + exprType.getAsString(), ExprRange); return QualType(); // error } // C99 6.5.3.4p4: the type (an unsigned integer type) is size_t. @@ -614,7 +617,8 @@ ActOnSizeOfAlignOfTypeExpr(SourceLocation OpLoc, bool isSizeof, // Verify that this is a valid expression. QualType ArgTy = QualType::getFromOpaquePtr(Ty); - QualType resultType = CheckSizeOfAlignOfOperand(ArgTy, OpLoc, isSizeof); + QualType resultType = + CheckSizeOfAlignOfOperand(ArgTy, OpLoc, SourceRange(LPLoc, RPLoc),isSizeof); if (resultType.isNull()) return true; @@ -2278,10 +2282,12 @@ Action::ExprResult Sema::ActOnUnaryOp(SourceLocation OpLoc, tok::TokenKind Op, resultType = Context.IntTy; break; case UnaryOperator::SizeOf: - resultType = CheckSizeOfAlignOfOperand(Input->getType(), OpLoc, true); + resultType = CheckSizeOfAlignOfOperand(Input->getType(), OpLoc, + Input->getSourceRange(), true); break; case UnaryOperator::AlignOf: - resultType = CheckSizeOfAlignOfOperand(Input->getType(), OpLoc, false); + resultType = CheckSizeOfAlignOfOperand(Input->getType(), OpLoc, + Input->getSourceRange(), false); break; case UnaryOperator::Real: case UnaryOperator::Imag: