mirror of
https://github.com/intel/llvm.git
synced 2026-01-22 23:49:22 +08:00
Add another keyword-selection flag to CorrectionCandidateCallback.
The new flag, WantFunctionLikeCasts, covers a subset of the keywords covered by WantTypeSpecifiers that can be used in casts that look like function calls, e.g. "return long(5);", while excluding the keywords like "enum" and "const" that would be included when WantTypeSpecifiers is true but cannot be used in something that looks like a function call. llvm-svn: 214109
This commit is contained in:
@@ -249,9 +249,9 @@ public:
|
||||
|
||||
CorrectionCandidateCallback()
|
||||
: WantTypeSpecifiers(true), WantExpressionKeywords(true),
|
||||
WantCXXNamedCasts(true), WantRemainingKeywords(true),
|
||||
WantObjCSuper(false), IsObjCIvarLookup(false),
|
||||
IsAddressOfOperand(false) {}
|
||||
WantCXXNamedCasts(true), WantFunctionLikeCasts(true),
|
||||
WantRemainingKeywords(true), WantObjCSuper(false),
|
||||
IsObjCIvarLookup(false), IsAddressOfOperand(false) {}
|
||||
|
||||
virtual ~CorrectionCandidateCallback() {}
|
||||
|
||||
@@ -277,11 +277,13 @@ public:
|
||||
return ValidateCandidate(candidate) ? 0 : InvalidDistance;
|
||||
}
|
||||
|
||||
// Flags for context-dependent keywords.
|
||||
// Flags for context-dependent keywords. WantFunctionLikeCasts is only
|
||||
// used/meaningful when WantCXXNamedCasts is false.
|
||||
// TODO: Expand these to apply to non-keywords or possibly remove them.
|
||||
bool WantTypeSpecifiers;
|
||||
bool WantExpressionKeywords;
|
||||
bool WantCXXNamedCasts;
|
||||
bool WantFunctionLikeCasts;
|
||||
bool WantRemainingKeywords;
|
||||
bool WantObjCSuper;
|
||||
// Temporary hack for the one case where a CorrectTypoContext enum is used
|
||||
@@ -325,6 +327,7 @@ public:
|
||||
WantTypeSpecifiers = false;
|
||||
WantExpressionKeywords = false;
|
||||
WantCXXNamedCasts = false;
|
||||
WantFunctionLikeCasts = false;
|
||||
WantRemainingKeywords = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -3972,6 +3972,13 @@ static void AddKeywordsToConsumer(Sema &SemaRef,
|
||||
|
||||
if (SemaRef.getLangOpts().GNUMode)
|
||||
Consumer.addKeywordResult("typeof");
|
||||
} else if (CCC.WantFunctionLikeCasts) {
|
||||
static const char *const CastableTypeSpecs[] = {
|
||||
"char", "double", "float", "int", "long", "short",
|
||||
"signed", "unsigned", "void"
|
||||
};
|
||||
for (auto *kw : CastableTypeSpecs)
|
||||
Consumer.addKeywordResult(kw);
|
||||
}
|
||||
|
||||
if (CCC.WantCXXNamedCasts && SemaRef.getLangOpts().CPlusPlus) {
|
||||
@@ -4461,7 +4468,8 @@ FunctionCallFilterCCC::FunctionCallFilterCCC(Sema &SemaRef, unsigned NumArgs,
|
||||
MemberExpr *ME)
|
||||
: NumArgs(NumArgs), HasExplicitTemplateArgs(HasExplicitTemplateArgs),
|
||||
CurContext(SemaRef.CurContext), MemberFn(ME) {
|
||||
WantTypeSpecifiers = SemaRef.getLangOpts().CPlusPlus;
|
||||
WantTypeSpecifiers = false;
|
||||
WantFunctionLikeCasts = SemaRef.getLangOpts().CPlusPlus && NumArgs == 1;
|
||||
WantRemainingKeywords = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -300,3 +300,12 @@ namespace PR19681 {
|
||||
(void)static_cast<void(TypoB::*)(int)>(&TypoA::private_memfn); // expected-error{{no member named 'private_memfn' in 'PR19681::TypoA'; did you mean '::PR19681::TypoB::private_memfn'?}}
|
||||
}
|
||||
}
|
||||
|
||||
namespace testWantFunctionLikeCasts {
|
||||
long test(bool a) {
|
||||
if (a)
|
||||
return struc(5.7); // expected-error-re {{use of undeclared identifier 'struc'{{$}}}}
|
||||
else
|
||||
return lon(8.0); // expected-error {{use of undeclared identifier 'lon'; did you mean 'long'?}}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user