Skip to content

Commit

Permalink
[Sema][OpenCL] Improve diagnostics for not viable overloadable functi…
Browse files Browse the repository at this point in the history
…on candidates

Summary:
Allowed extension name (that ought to be disabled) printing in the note message.

This diagnostic was proposed here: https://reviews.llvm.org/D51341

Reviewers: Anastasia, yaxunl

Reviewed By: Anastasia

Subscribers: cfe-commits, asavonic, bader

Differential Revision: https://reviews.llvm.org/D52292

llvm-svn: 344246
  • Loading branch information
Andrew Savonichev committed Oct 11, 2018
1 parent 0f80d9f commit 16f1699
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 3 deletions.
2 changes: 1 addition & 1 deletion clang/include/clang/Basic/DiagnosticSemaKinds.td
Expand Up @@ -3674,7 +3674,7 @@ def warn_diagnose_if_succeeded : Warning<"%0">, InGroup<UserDefinedWarnings>,
def note_ovl_candidate_disabled_by_function_cond_attr : Note<
"candidate disabled: %0">;
def note_ovl_candidate_disabled_by_extension : Note<
"candidate disabled due to OpenCL extension">;
"candidate unavailable as it requires OpenCL extension '%0' to be disabled">;
def err_addrof_function_disabled_by_enable_if_attr : Error<
"cannot take address of function %0 because it has one or more "
"non-tautological enable_if conditions">;
Expand Down
15 changes: 15 additions & 0 deletions clang/include/clang/Sema/Sema.h
Expand Up @@ -8576,6 +8576,21 @@ class Sema {
llvm::StringRef getCurrentOpenCLExtension() const {
return CurrOpenCLExtension;
}

/// Check if a function declaration \p FD associates with any
/// extensions present in OpenCLDeclExtMap and if so return the
/// extension(s) name(s).
std::string getOpenCLExtensionsFromDeclExtMap(FunctionDecl *FD);

/// Check if a function type \p FT associates with any
/// extensions present in OpenCLTypeExtMap and if so return the
/// extension(s) name(s).
std::string getOpenCLExtensionsFromTypeExtMap(FunctionType *FT);

/// Find an extension in an appropriate extension map and return its name
template<typename T, typename MapT>
std::string getOpenCLExtensionsFromExtMap(T* FT, MapT &Map);

void setCurrentOpenCLExtension(llvm::StringRef Ext) {
CurrOpenCLExtension = Ext;
}
Expand Down
28 changes: 28 additions & 0 deletions clang/lib/Sema/Sema.cpp
Expand Up @@ -1914,6 +1914,34 @@ void Sema::setCurrentOpenCLExtensionForDecl(Decl *D) {
setOpenCLExtensionForDecl(D, CurrOpenCLExtension);
}

std::string Sema::getOpenCLExtensionsFromDeclExtMap(FunctionDecl *FD) {
if (!OpenCLDeclExtMap.empty())
return getOpenCLExtensionsFromExtMap(FD, OpenCLDeclExtMap);

return "";
}

std::string Sema::getOpenCLExtensionsFromTypeExtMap(FunctionType *FT) {
if (!OpenCLTypeExtMap.empty())
return getOpenCLExtensionsFromExtMap(FT, OpenCLTypeExtMap);

return "";
}

template <typename T, typename MapT>
std::string Sema::getOpenCLExtensionsFromExtMap(T *FDT, MapT &Map) {
std::string ExtensionNames = "";
auto Loc = Map.find(FDT);

for (auto const& I : Loc->second) {
ExtensionNames += I;
ExtensionNames += " ";
}
ExtensionNames.pop_back();

return ExtensionNames;
}

bool Sema::isOpenCLDisabledDecl(Decl *FD) {
auto Loc = OpenCLDeclExtMap.find(FD);
if (Loc == OpenCLDeclExtMap.end())
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Sema/SemaOverload.cpp
Expand Up @@ -10242,7 +10242,8 @@ static void DiagnoseOpenCLExtensionDisabled(Sema &S, OverloadCandidate *Cand) {
FunctionDecl *Callee = Cand->Function;

S.Diag(Callee->getLocation(),
diag::note_ovl_candidate_disabled_by_extension);
diag::note_ovl_candidate_disabled_by_extension)
<< S.getOpenCLExtensionsFromDeclExtMap(Callee);
}

/// Generates a 'note' diagnostic for an overload candidate. We've
Expand Down
2 changes: 1 addition & 1 deletion clang/test/SemaOpenCL/extension-begin.cl
Expand Up @@ -48,7 +48,7 @@ void test_f2(void) {
PointerOfA test_A_pointer; // expected-error {{use of type 'PointerOfA' (aka 'const struct A *') requires my_ext extension to be enabled}}
f(); // expected-error {{use of declaration 'f' requires my_ext extension to be enabled}}
g(0); // expected-error {{no matching function for call to 'g'}}
// expected-note@-26 {{candidate disabled due to OpenCL extension}}
// expected-note@-26 {{candidate unavailable as it requires OpenCL extension 'my_ext' to be disabled}}
// expected-note@-22 {{candidate function not viable: requires 0 arguments, but 1 was provided}}
}

Expand Down

0 comments on commit 16f1699

Please sign in to comment.