]> granicus.if.org Git - clang/commitdiff
Parse an '@' in an Objective-C++ class member specification,
authorDouglas Gregor <dgregor@apple.com>
Thu, 14 Apr 2011 17:21:19 +0000 (17:21 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 14 Apr 2011 17:21:19 +0000 (17:21 +0000)
diagnosing it as an error rather than looping infinitely. Also,
explicitly disallow @defs in Objective-C++. Fixes <rdar://problem/9260136>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129521 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticParseKinds.td
lib/Parse/ParseDeclCXX.cpp
test/Parser/objcxx-at.mm [new file with mode: 0644]

index 82c73d0194f37d75af65a2946ad5ebf8338341c2..273d6cc08885b6dc1b1a3f36e32896d8a2f2cd52 100644 (file)
@@ -120,6 +120,9 @@ def err_function_declared_typedef : Error<
 def err_iboutletcollection_builtintype : Error<
   "type argument of iboutletcollection attribute cannot be a builtin type">;
 
+def err_at_defs_cxx : Error<"@defs is not supported in Objective-C++">;
+def err_at_in_class : Error<"unexpected '@' in member specification">;
+
 def err_expected_fn_body : Error<
   "expected function body after function declarator">;
 def err_expected_method_body : Error<"expected method body">;
@@ -370,8 +373,8 @@ def err_enum_template : Error<"enumeration cannot be a template">;
 
 def err_missing_dependent_template_keyword : Error<
   "use 'template' keyword to treat '%0' as a dependent template name">;
-def war_missing_dependent_template_keyword : ExtWarn<\r
-  "use 'template' keyword to treat '%0' as a dependent template name">;\r
+def war_missing_dependent_template_keyword : ExtWarn<
+  "use 'template' keyword to treat '%0' as a dependent template name">;
 
 def warn_static_inline_explicit_inst_ignored : Warning<
   "ignoring '%select{static|inline}0' keyword on explicit template "
index dac40d87139ff65df2a2dcc4d083e6b0106f4b6b..9c0730dce9f59772fa567d1f4f7766bcdf139aa7 100644 (file)
@@ -1374,6 +1374,17 @@ bool Parser::isCXX0XFinalKeyword() const {
 void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
                                        const ParsedTemplateInfo &TemplateInfo,
                                        ParsingDeclRAIIObject *TemplateDiags) {
+  if (Tok.is(tok::at)) {
+    if (getLang().ObjC1 && NextToken().isObjCAtKeyword(tok::objc_defs))
+      Diag(Tok, diag::err_at_defs_cxx);
+    else
+      Diag(Tok, diag::err_at_in_class);
+    
+    ConsumeToken();
+    SkipUntil(tok::r_brace);
+    return;
+  }
+  
   // Access declarations.
   if (!TemplateInfo.Kind &&
       (Tok.is(tok::identifier) || Tok.is(tok::coloncolon)) &&
diff --git a/test/Parser/objcxx-at.mm b/test/Parser/objcxx-at.mm
new file mode 100644 (file)
index 0000000..37aee4d
--- /dev/null
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+@interface B {
+  int i;
+}
+@end
+
+struct Z {
+  @defs(B); // expected-error{{@defs is not supported in Objective-C++}}
+};
+
+struct Y { // expected-note{{to match this '{'}}
+  struct X { } // expected-error{{expected ';' after struct}}
+    @interface A // expected-error{{unexpected '@' in member specification}}
+} // expected-error{{expected '}'}} expected-error{{expected ';' after struct}}