]> granicus.if.org Git - clang/commitdiff
Fix http://llvm.org/bugs/show_bug.cgi?id=2106.
authorSteve Naroff <snaroff@apple.com>
Fri, 29 Feb 2008 21:48:07 +0000 (21:48 +0000)
committerSteve Naroff <snaroff@apple.com>
Fri, 29 Feb 2008 21:48:07 +0000 (21:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47768 91177308-0d34-0410-b5e6-96231b3b80d8

Parse/ParseObjc.cpp
Sema/SemaDeclObjC.cpp
include/clang/Basic/DiagnosticKinds.def
test/Sema/missing-method-context.m [new file with mode: 0644]

index 24d6309905a0205e815acab44c46c7533572ab8c..816d2bf6a3d3d033fa3fe6e63422a0cb914616d6 100644 (file)
@@ -1240,7 +1240,7 @@ Parser::DeclTy *Parser::ParseObjCMethodDefinition() {
 
   // We should have an opening brace now.
   if (Tok.isNot(tok::l_brace)) {
-    Diag(Tok, diag::err_expected_fn_body);
+    Diag(Tok, diag::err_expected_method_body);
     
     // Skip over garbage, until we get to '{'.  Don't eat the '{'.
     SkipUntil(tok::l_brace, true, true);
index 267a9ef789640c2dca574d5cf32f2875cc6a5bf4..04ce426dec976fdfc0fd19aebdb11e3d82278c46 100644 (file)
@@ -807,6 +807,12 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration(
     ObjCDeclSpec *ArgQT, TypeTy **ArgTypes, IdentifierInfo **ArgNames,
     AttributeList *AttrList, tok::ObjCKeywordKind MethodDeclKind,
     bool isVariadic) {
+
+  // Make sure we can establish a context for the method.
+  if (!ClassDecl) {
+    Diag(MethodLoc, diag::error_missing_method_context);
+    return 0;
+  }
   llvm::SmallVector<ParmVarDecl*, 16> Params;
   
   for (unsigned i = 0; i < Sel.getNumArgs(); i++) {
index 3d0a3f8815f8128ce71b7023841af537327f6026..2ebe72ed55fc3ddfc08b3e5841d446c8dfef8ed4 100644 (file)
@@ -356,6 +356,8 @@ DIAG(err_function_declared_typedef, ERROR,
      "function definition declared 'typedef'")
 DIAG(err_expected_fn_body, ERROR,
      "expected function body after function declarator")
+DIAG(err_expected_method_body, ERROR,
+     "expected method body")
 DIAG(err_expected_after_declarator, ERROR,
      "expected '=', ',', ';', 'asm', or '__attribute__' after declarator")
 DIAG(err_expected_statement, ERROR,
@@ -484,6 +486,8 @@ DIAG(err_toomany_element_decls, ERROR,
      "Only one element declaration is allowed")
 DIAG(warn_expected_implementation, WARNING,
      "@end must appear in an @implementation context")
+DIAG(error_missing_method_context, ERROR,
+     "missing context for method declaration")
 DIAG(error_bad_receiver_type, ERROR,
      "bad receiver type '%0'")
 
diff --git a/test/Sema/missing-method-context.m b/test/Sema/missing-method-context.m
new file mode 100644 (file)
index 0000000..20437b7
--- /dev/null
@@ -0,0 +1,4 @@
+// RUN: clang %s -verify -fsyntax-only
+- (void)compilerTestAgainst;  // expected-error {{missing context for method declaration}}
+
+void xx();  // expected-error {{expected method body}}