Skip to content

Commit

Permalink
[clang] Include type specifiers in typo correction when checking isCX…
Browse files Browse the repository at this point in the history
…XDeclarationSpecifiers.

- add more tests (the test added in 2f44846 is weak);
- improve the `MyTemplate<type_typo, int>();` case, with this patch, typo correction
  suggests the type decl, and no regressions found.

Differential Revision: https://reviews.llvm.org/D83025
  • Loading branch information
hokein committed Jul 13, 2020
1 parent afcc9a8 commit 1d3d9c7
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 16 deletions.
5 changes: 3 additions & 2 deletions clang/lib/Parse/ParseTentative.cpp
Expand Up @@ -1110,8 +1110,9 @@ class TentativeParseCCC final : public CorrectionCandidateCallback {
public:
TentativeParseCCC(const Token &Next) {
WantRemainingKeywords = false;
WantTypeSpecifiers = Next.isOneOf(tok::l_paren, tok::r_paren, tok::greater,
tok::l_brace, tok::identifier);
WantTypeSpecifiers =
Next.isOneOf(tok::l_paren, tok::r_paren, tok::greater, tok::l_brace,
tok::identifier, tok::comma);
}

bool ValidateCandidate(const TypoCorrection &Candidate) override {
Expand Down
14 changes: 0 additions & 14 deletions clang/test/Parser/cxx-template-decl.cpp
Expand Up @@ -286,17 +286,3 @@ namespace PR45239 {
template<int> int b;
template<int> auto f() -> b<0>; // expected-error +{{}}
}

namespace NoCrashOnNullNNSTypoCorrection {

int AddObservation(); // expected-note {{declared here}}

template <typename T, typename... Args> // expected-note {{template parameter is declared here}}
class UsingImpl {};
class AddObservation {
using Using =
UsingImpl<AddObservationFn, const int>; // expected-error {{use of undeclared identifier 'AddObservationFn'; did you mean}} \
expected-error {{template argument for template type parameter must be a type}}
};

}
35 changes: 35 additions & 0 deletions clang/test/SemaCXX/typo-correction.cpp
Expand Up @@ -611,6 +611,41 @@ int bar() {
}
}

namespace testIncludeTypeInTemplateArgument {
template <typename T, typename U>
void foo(T t = {}, U = {}); // expected-note {{candidate template ignored}}

class AddObservation {}; // expected-note {{declared here}}
int bar1() {
// should resolve to a class.
foo<AddObservationFn, int>(); // expected-error {{unknown type name 'AddObservationFn'; did you mean 'AddObservation'?}}

// should not resolve to a class.
foo(AddObservationFn, 1); // expected-error-re {{use of undeclared identifier 'AddObservationFn'{{$}}}}
int a = AddObservationFn, b; // expected-error-re {{use of undeclared identifier 'AddObservationFn'{{$}}}}

int AddObservation; // expected-note 3{{declared here}}
// should resolve to a local variable.
foo(AddObservationFn, 1); // expected-error {{use of undeclared identifier 'AddObservationFn'; did you mean}}
int c = AddObservationFn, d; // expected-error {{use of undeclared identifier 'AddObservationFn'; did you mean}}

// FIXME: would be nice to not resolve to a variable.
foo<AddObservationFn, int>(); // expected-error {{use of undeclared identifier 'AddObservationFn'; did you mean}} \
expected-error {{no matching function for call}}
}
} // namespace testIncludeTypeInTemplateArgument

namespace testNoCrashOnNullNNSTypoCorrection {
int AddObservation();
template <typename T, typename... Args>
class UsingImpl {};
class AddObservation { // expected-note {{declared here}}
using Using =
// should resolve to a class.
UsingImpl<AddObservationFn, const int>; // expected-error {{unknown type name 'AddObservationFn'; did you mean}}
};
} // namespace testNoCrashOnNullNNSTypoCorrection

namespace testNonStaticMemberHandling {
struct Foo {
bool usesMetadata; // expected-note {{'usesMetadata' declared here}}
Expand Down

0 comments on commit 1d3d9c7

Please sign in to comment.