[PATCH] D42170: Fixit for 'typedef' instead of 'typename' typo
Jan Korous via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 31 04:11:45 PST 2018
jkorous-apple updated this revision to Diff 132135.
jkorous-apple added a comment.
Tried to make test more readable.
https://reviews.llvm.org/D42170
Files:
FixIt/fixit-typedef-instead-of-typename-typo.cpp
Parse/ParseTemplate.cpp
clang/Basic/DiagnosticParseKinds.td
Index: FixIt/fixit-typedef-instead-of-typename-typo.cpp
===================================================================
--- /dev/null
+++ FixIt/fixit-typedef-instead-of-typename-typo.cpp
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits -verify %s
+
+template <typename A, typedef B> struct Foo {
+ // expected-error at -1 {{expected template parameter}} expected-note at -1 {{did you mean to use 'typename'?}}
+
+ // Check that we are speculatively (with fixit applied) trying to parse the rest.
+
+ // Should not produce error about type since parsing speculatively with fixit applied.
+ B member;
+
+ a // expected-error {{unknown type name 'a'}} // expected-error at +1 {{expected member name or ';' after declaration specifiers}}
+};
+
+
+// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
+// CHECK: fix-it:{{.*}}:{3:23-3:30}:"typename"
Index: Parse/ParseTemplate.cpp
===================================================================
--- Parse/ParseTemplate.cpp
+++ Parse/ParseTemplate.cpp
@@ -488,6 +488,20 @@
if (Tok.is(tok::kw_template))
return ParseTemplateTemplateParameter(Depth, Position);
+ // Is there just a typo in the input code? ('typedef' instead of 'typename')
+ if (Tok.is(tok::kw_typedef)) {
+ Diag(Tok.getLocation(), diag::err_expected_template_parameter);
+
+ Diag(Tok.getLocation(), diag::note_meant_to_use_typename)
+ << FixItHint::CreateReplacement(CharSourceRange::getCharRange(
+ Tok.getLocation(), Tok.getEndLoc()),
+ "typename");
+
+ Tok.setKind(tok::kw_typename);
+
+ return ParseTypeParameter(Depth, Position);
+ }
+
// If it's none of the above, then it must be a parameter declaration.
// NOTE: This will pick up errors in the closure of the template parameter
// list (e.g., template < ; Check here to implement >> style closures.
Index: clang/Basic/DiagnosticParseKinds.td
===================================================================
--- clang/Basic/DiagnosticParseKinds.td
+++ clang/Basic/DiagnosticParseKinds.td
@@ -1162,6 +1162,9 @@
def err_objc_type_args_after_protocols : Error<
"protocol qualifiers must precede type arguments">;
+
+def note_meant_to_use_typename : Note<
+ "did you mean to use 'typename'?">;
}
let CategoryName = "Coroutines Issue" in {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D42170.132135.patch
Type: text/x-patch
Size: 2414 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180131/dac22145/attachment.bin>
More information about the cfe-commits
mailing list