aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-03-24 18:08:23 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-03-24 18:08:23 +0000
commitf3c0bd58400b5a84d16376436e40af79e2d7b105 (patch)
treeb4d65e4a0b7896f2ec613a73a53a38331fc679a9
parent036ada215d2c53e6a286b42d7cbd2386b0007516 (diff)
Improve diagnostics when ivar added to class
extension (radar 6812436). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99408 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/DiagnosticSemaKinds.td3
-rw-r--r--lib/Sema/SemaDecl.cpp2
-rw-r--r--test/SemaObjC/ivar-in-class-extension-error.m15
3 files changed, 18 insertions, 2 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td
index c563d11643..18f3329f25 100644
--- a/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/include/clang/Basic/DiagnosticSemaKinds.td
@@ -1544,7 +1544,8 @@ def err_forward_ref_enum : Error<
"ISO C++ forbids forward references to 'enum' types">;
def err_redefinition_of_enumerator : Error<"redefinition of enumerator %0">;
def err_duplicate_member : Error<"duplicate member %0">;
-def err_misplaced_ivar : Error<"ivars may not be placed in categories">;
+def err_misplaced_ivar : Error<
+ "ivars may not be placed in %select{categories|class extension}0">;
def ext_enum_value_not_int : Extension<
"ISO C restricts enumerator values to range of 'int' (%0 is too "
"%select{small|large}1)">;
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index e4c930e2f8..87b2f80886 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -5850,7 +5850,7 @@ void Sema::ActOnFields(Scope* S,
} else if (ObjCCategoryDecl *CDecl =
dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
if (!LangOpts.ObjCNonFragileABI2 || !CDecl->IsClassExtension())
- Diag(LBrac, diag::err_misplaced_ivar);
+ Diag(LBrac, diag::err_misplaced_ivar) << CDecl->IsClassExtension();
else {
// FIXME. Class extension does not have a LocEnd field.
// CDecl->setLocEnd(RBrac);
diff --git a/test/SemaObjC/ivar-in-class-extension-error.m b/test/SemaObjC/ivar-in-class-extension-error.m
new file mode 100644
index 0000000000..ffc0e8b839
--- /dev/null
+++ b/test/SemaObjC/ivar-in-class-extension-error.m
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+// rdar:// 6812436
+
+@interface A @end
+
+@interface A () { // expected-error {{ivars may not be placed in class extension}}
+ int _p0;
+}
+@property int p0;
+@end
+
+@interface A(CAT) { // expected-error {{ivars may not be placed in categories}}
+ int _p1;
+}
+@end