From: Alp Toker Date: Mon, 6 Jan 2014 11:31:18 +0000 (+0000) Subject: Highlight the previous underlying enum type when diagnosing a mismatch X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1402547b849fa23188cfe89dd0b0c0b452a6ffc0;p=clang Highlight the previous underlying enum type when diagnosing a mismatch enum-scoped.cpp:93:6: error: enumeration redeclared with different underlying type 'short' (was 'int') enum Redeclare6 : short; ^ enum-scoped.cpp:92:6: note: previous declaration is here enum Redeclare6 : int; ^ ~~~ The redeclaration source range is still missing but this is a step forward, potentially edging towards a FixIt. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@198601 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index da72e7e00c..09aff1b397 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -2900,6 +2900,10 @@ public: return IntegerType.dyn_cast(); } + /// \brief Retrieve the source range that covers the underlying type if + /// specified. + SourceRange getIntegerTypeRange() const LLVM_READONLY; + /// \brief Returns the width in bits required to store all the /// non-negative enumerators of this enum. unsigned getNumPositiveBits() const { diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 754f790d8b..29443960c4 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -3280,6 +3280,12 @@ EnumDecl *EnumDecl::CreateDeserialized(ASTContext &C, unsigned ID) { return Enum; } +SourceRange EnumDecl::getIntegerTypeRange() const { + if (const TypeSourceInfo *TI = getIntegerTypeSourceInfo()) + return TI->getTypeLoc().getSourceRange(); + return SourceRange(); +} + void EnumDecl::completeDefinition(QualType NewType, QualType NewPromotionType, unsigned NumPositiveBits, diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index c17510ae8a..07a551da2f 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -10257,9 +10257,11 @@ bool Sema::CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped, !Prev->getIntegerType()->isDependentType() && !Context.hasSameUnqualifiedType(EnumUnderlyingTy, Prev->getIntegerType())) { + // TODO: Highlight the underlying type of the redeclaration. Diag(EnumLoc, diag::err_enum_redeclare_type_mismatch) << EnumUnderlyingTy << Prev->getIntegerType(); - Diag(Prev->getLocation(), diag::note_previous_declaration); + Diag(Prev->getLocation(), diag::note_previous_declaration) + << Prev->getIntegerTypeRange(); return true; } } else if (IsFixed != Prev->isFixed()) {