diff --git a/AST/ASTContext.cpp b/AST/ASTContext.cpp index c00779c171..d01de2b3a9 100644 --- a/AST/ASTContext.cpp +++ b/AST/ASTContext.cpp @@ -1709,10 +1709,14 @@ bool ASTContext::typesAreCompatible(QualType lhs, QualType rhs) { // C99 6.7.2.2p4: Each enumerated type shall be compatible with char, // a signed integer type, or an unsigned integer type. - // FIXME: need to check the size and ensure it's the same. - if ((lcanon->isEnumeralType() && rcanon->isIntegralType()) || - (rcanon->isEnumeralType() && lcanon->isIntegralType())) - return true; + if (lcanon->isEnumeralType() && rcanon->isIntegralType()) { + EnumDecl* EDecl = cast(cast(lcanon)->getDecl()); + return EDecl->getIntegerType() == rcanon; + } + if (rcanon->isEnumeralType() && lcanon->isIntegralType()) { + EnumDecl* EDecl = cast(cast(rcanon)->getDecl()); + return EDecl->getIntegerType() == lcanon; + } return false; } diff --git a/test/Sema/conditional-expr.c b/test/Sema/conditional-expr.c index a24846ac1d..813aaee9d0 100644 --- a/test/Sema/conditional-expr.c +++ b/test/Sema/conditional-expr.c @@ -27,5 +27,9 @@ void foo() { int (*pf)[2]; int (*pv)[i]; pf = (i ? pf : pv); + + enum {xxx,yyy,zzz} e, *ee; + short x; + ee = ee ? &x : ee ? &i : &e; // expected-warning {{pointer type mismatch}} }