diff options
| -rw-r--r-- | clang/lib/AST/Type.cpp | 16 | ||||
| -rw-r--r-- | clang/test/Sema/enum.c | 13 |
2 files changed, 25 insertions, 4 deletions
diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 3c9561cd44b..56cd4dddb5c 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -489,8 +489,12 @@ bool Type::isSignedIntegerType() const { BT->getKind() <= BuiltinType::Int128; } - if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) - return ET->getDecl()->getIntegerType()->isSignedIntegerType(); + if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) { + // Incomplete enum types are not treated as integer types. + // FIXME: In C++, enum types are never integer types. + if (ET->getDecl()->isComplete()) + return ET->getDecl()->getIntegerType()->isSignedIntegerType(); + } return false; } @@ -511,8 +515,12 @@ bool Type::isUnsignedIntegerType() const { BT->getKind() <= BuiltinType::UInt128; } - if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) - return ET->getDecl()->getIntegerType()->isUnsignedIntegerType(); + if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) { + // Incomplete enum types are not treated as integer types. + // FIXME: In C++, enum types are never integer types. + if (ET->getDecl()->isComplete()) + return ET->getDecl()->getIntegerType()->isUnsignedIntegerType(); + } return false; } diff --git a/clang/test/Sema/enum.c b/clang/test/Sema/enum.c index d83b06f56ba..a95efb035db 100644 --- a/clang/test/Sema/enum.c +++ b/clang/test/Sema/enum.c @@ -104,3 +104,16 @@ void PR7911F() { } char test5[__has_feature(enumerator_attributes) ? 1 : -1]; + +// PR8694 +// rdar://8707031 +void PR8694(int* e) // expected-note {{passing argument to parameter 'e' here}} +{ +} + +void crash(enum E* e) // expected-warning {{declaration of 'enum E' will not be visible outside of this function}} \ + // expected-warning {{ISO C forbids forward references to 'enum' types}} +{ + PR8694(e); // expected-warning {{incompatible pointer types passing 'enum E *' to parameter of type 'int *'}} +} + |

