aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2011-11-29 09:09:06 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2011-11-29 09:09:06 +0000
commit6e1fd33116c2977174f2df17ac8bad2a32659db8 (patch)
tree579a44c9076fbd7331737adfc5f8614e1f07c7ea
parent2fea2242fe7e7c37df1e96316616febeaf4e29eb (diff)
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
-rw-r--r--lib/Parse/ParseTemplate.cpp8
-rw-r--r--test/FixIt/fixit.cpp13
2 files changed, 15 insertions, 6 deletions
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<class T> struct Mystery;
+template<class T> typedef Mystery<T>::type getMysteriousThing() { // \
+ expected-error {{function definition declared 'typedef'}} \
+ expected-error {{missing 'typename' prior to dependent}}
+ return Mystery<T>::get();
+}