]> granicus.if.org Git - clang/commitdiff
Revert most of r145372 for now. Lookahead beyond the ';' in a function
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 30 Nov 2011 23:45:35 +0000 (23:45 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 30 Nov 2011 23:45:35 +0000 (23:45 +0000)
declaration tickles a bug in the way we handle visibility pragmas.

The improvement to error recovery for template function definitions declared
with the 'typedef' specifier in r145372 is unrelated and not reverted here.

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

include/clang/Basic/DiagnosticParseKinds.td
lib/Parse/ParseDecl.cpp
lib/Parse/ParseTemplate.cpp
test/FixIt/fixit-cxx0x.cpp
test/FixIt/fixit.c
test/FixIt/fixit.cpp

index 9b5540d4c99dcf06fcc06eba376c3088392083f8..e0b10fa87c2c0f84a83566d6cc627c8dfaf64f8b 100644 (file)
@@ -138,8 +138,6 @@ def ext_expected_semi_decl_list : ExtWarn<
   "expected ';' at end of declaration list">;
 def err_expected_member_name_or_semi : Error<
   "expected member name or ';' after declaration specifiers">;
-def err_stray_semi_function_definition : Error<
-  "stray ';' in function definition">;
 def err_function_declared_typedef : Error<
   "function definition declared 'typedef'">;
 def err_iboutletcollection_builtintype : Error<
index 75c423340c36620090099898f7ca8a8817785a3d..3bddd3de13d06a49389aca61a76fa6ef3eb0b061 100644 (file)
@@ -1041,28 +1041,13 @@ Parser::DeclGroupPtrTy Parser::ParseDeclGroup(ParsingDeclSpec &DS,
     return DeclGroupPtrTy();
   }
 
-  // Do we have a stray semicolon in the middle of a function definition?
-  if (AllowFunctionDefinitions && D.isFunctionDeclarator() &&
-      Tok.is(tok::semi) && Context == Declarator::FileContext) {
-    const Token &Next = NextToken();
-    if (Next.is(tok::l_brace) || Next.is(tok::kw_try) ||
-        (getLang().CPlusPlus &&
-         (Next.is(tok::colon) || Next.is(tok::equal)))) {
-      // Pretend we didn't see the semicolon.
-      SourceLocation SemiLoc = ConsumeToken();
-      Diag(SemiLoc, diag::err_stray_semi_function_definition)
-        << FixItHint::CreateRemoval(SemiLoc);
-      assert(isStartOfFunctionDefinition(D) && "expected a function defn");
-    }
-  }
-
   // Check to see if we have a function *definition* which must have a body.
   if (AllowFunctionDefinitions && D.isFunctionDeclarator() &&
       // Look at the next token to make sure that this isn't a function
       // declaration.  We have to check this because __attribute__ might be the
       // start of a function definition in GCC-extended K&R C.
       !isDeclarationAfterDeclarator()) {
-
+    
     if (isStartOfFunctionDefinition(D)) {
       if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) {
         Diag(Tok, diag::err_function_declared_typedef);
index 7b09f8191d2d9916678f9eecc8979653b82fd756..9343f5b733a0cac7b63022708ac86c2059a1053e 100644 (file)
@@ -240,20 +240,6 @@ Parser::ParseSingleDeclarationAfterTemplate(
     return 0;
   }
 
-  // Check for a stray semicolon in a function definition.
-  if (DeclaratorInfo.isFunctionDeclarator() && Tok.is(tok::semi) &&
-      Context == Declarator::FileContext) {
-    const Token &Next = NextToken();
-    if (Next.is(tok::l_brace) || Next.is(tok::kw_try) ||
-        Next.is(tok::equal) || Next.is(tok::colon)) {
-      SourceLocation SemiLoc = ConsumeToken();
-      Diag(SemiLoc, diag::err_stray_semi_function_definition)
-        << FixItHint::CreateRemoval(SemiLoc);
-      assert(!isDeclarationAfterDeclarator() &&
-             isStartOfFunctionDefinition(DeclaratorInfo));
-    }
-  }
-
   // If we have a declaration or declarator list, handle it.
   if (isDeclarationAfterDeclarator()) {
     // Parse this declaration.
index d9b8763b056c3dd6b7ba15ce2c3bf74c313bf438..9fb647d03fcd6ba7cc19db5781bbc4d028df8fb4 100644 (file)
@@ -58,26 +58,3 @@ namespace SemiCommaTypo {
   n [[]], // expected-error {{expected ';' at end of declaration}}
   int o;
 }
-
-int extraSemi(); // expected-error {{stray ';' in function definition}}
-  = delete;
-
-class ExtraSemi {
-public:
-  ExtraSemi();
-  ExtraSemi(const ExtraSemi &);
-  int n;
-};
-ExtraSemi::ExtraSemi(); // expected-error {{stray ';'}}
- : n(0) {
-}
-ExtraSemi::ExtraSemi(const ExtraSemi &); // expected-error {{stray ';'}}
-  = default;
-
-template<typename T> T extraSemi(T t);
-
-template<typename T> T extraSemi(T t); // expected-error {{stray ';'}}
-{
-  return t;
-}
-template int extraSemi(int);
index da1144da0fe9c80313cd82d9be32f86584988c70..967ae23c186c047707418a41b9f940bc153cca87 100644 (file)
@@ -77,11 +77,3 @@ void oopsMoreCommas() {
   static int b[] = { 3, 4, 5 },
   &a == &b ? oopsMoreCommas() : removeUnusedLabels(a[0]);
 }
-
-void extraSemicolon();
-{
-  void extraSemicolon();
-  {
-    return;
-  }
-}
index e0fa6088c371fb09dbb2c51c6c71b7d5aab8f314..31ef18e4048d85c9eb3fe9e3b30665768fa9e321 100644 (file)
@@ -126,16 +126,6 @@ AD oopsMoreCommas() {
   return ad;
 }
 
-int extraSemi1(); // expected-error {{stray ';' in function definition}}
-{
-  return 0;
-}
-
-int extraSemi2(); // expected-error {{stray ';' in function definition}}
-try {
-} catch (...) {
-}
-
 template<class T> struct Mystery;
 template<class T> typedef Mystery<T>::type getMysteriousThing() { // \
   expected-error {{function definition declared 'typedef'}} \