From: Richard Smith Date: Tue, 29 Nov 2011 09:09:06 +0000 (+0000) Subject: Add fix-it to remove 'typedef' from function template definitions. Such a token X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e1fd33116c2977174f2df17ac8bad2a32659db8;p=clang Add fix-it to remove 'typedef' from function template definitions. Such a token was probably meant to be 'typename', which we will have already suggested if it is appropriate. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145395 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseTemplate.cpp b/lib/Parse/ParseTemplate.cpp index 91cf8e81c2..7b09f8191d 100644 --- a/lib/Parse/ParseTemplate.cpp +++ b/lib/Parse/ParseTemplate.cpp @@ -276,9 +276,11 @@ Parser::ParseSingleDeclarationAfterTemplate( if (DeclaratorInfo.isFunctionDeclarator() && isStartOfFunctionDefinition(DeclaratorInfo)) { if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) { - Diag(Tok, diag::err_function_declared_typedef); - - // Recover by ignoring the 'typedef'. + // Recover by ignoring the 'typedef'. This was probably supposed to be + // the 'typename' keyword, which we should have already suggested adding + // if it's appropriate. + Diag(DS.getStorageClassSpecLoc(), diag::err_function_declared_typedef) + << FixItHint::CreateRemoval(DS.getStorageClassSpecLoc()); DS.ClearStorageClassSpecs(); } return ParseFunctionDefinition(DeclaratorInfo, TemplateInfo); diff --git a/test/FixIt/fixit.cpp b/test/FixIt/fixit.cpp index 7c8ba9ac6f..e0fa6088c3 100644 --- a/test/FixIt/fixit.cpp +++ b/test/FixIt/fixit.cpp @@ -1,7 +1,7 @@ -// RUN: %clang_cc1 -pedantic -Wall -verify -fcxx-exceptions -x c++ %s +// RUN: %clang_cc1 -pedantic -Wall -Wno-comment -verify -fcxx-exceptions -x c++ %s // RUN: cp %s %t -// RUN: not %clang_cc1 -pedantic -Wall -fcxx-exceptions -fixit -x c++ %t -// RUN: %clang_cc1 -fsyntax-only -pedantic -Wall -Werror -fcxx-exceptions -x c++ %t +// RUN: not %clang_cc1 -pedantic -Wall -Wno-comment -fcxx-exceptions -fixit -x c++ %t +// RUN: %clang_cc1 -fsyntax-only -pedantic -Wall -Werror -Wno-comment -fcxx-exceptions -x c++ %t /* This is a test of the various code modification hints that are provided as part of warning or extension diagnostics. All of the @@ -135,3 +135,10 @@ int extraSemi2(); // expected-error {{stray ';' in function definition}} try { } catch (...) { } + +template struct Mystery; +template typedef Mystery::type getMysteriousThing() { // \ + expected-error {{function definition declared 'typedef'}} \ + expected-error {{missing 'typename' prior to dependent}} + return Mystery::get(); +}