From: Eli Friedman Date: Wed, 26 Oct 2011 07:38:19 +0000 (+0000) Subject: Compute the promoted integer type of fixed-width enums correctly. Found by inspection. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3bfb571bd4af9303781c40306a06bf70fe51fa75;p=clang Compute the promoted integer type of fixed-width enums correctly. Found by inspection. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143021 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 2241024ba4..7ad8fb34b8 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -9702,7 +9702,11 @@ void Sema::ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc, Packed = true; if (Enum->isFixed()) { - BestType = BestPromotionType = Enum->getIntegerType(); + BestType = Enum->getIntegerType(); + if (BestType->isPromotableIntegerType()) + BestPromotionType = Context.getPromotedIntegerType(BestType); + else + BestPromotionType = BestType; // We don't need to set BestWidth, because BestType is going to be the type // of the enumerators, but we do anyway because otherwise some compilers // warn that it might be used uninitialized. diff --git a/test/CXX/conv/conv.prom/p4.cpp b/test/CXX/conv/conv.prom/p4.cpp new file mode 100644 index 0000000000..02a91cd521 --- /dev/null +++ b/test/CXX/conv/conv.prom/p4.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x %s + +enum X : short { A, B }; +extern decltype(+A) x; +extern int x; + +enum Y : long { C, D }; +extern decltype(+C) y; +extern long y;