mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-15 12:39:19 +00:00
Suppress undefined-template warnings when the pattern is declared in a system header.
The way to fix an undefined-template warning is to add lines to the header file that defines the template pattern. We should suppress the warnings when the template pattern is in a system header because we don't expect users to edit those. llvm-svn: 321665
This commit is contained in:
parent
a911f39d3d
commit
2adab1bc56
@ -3812,7 +3812,8 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
|
||||
PendingInstantiations.push_back(
|
||||
std::make_pair(Function, PointOfInstantiation));
|
||||
} else if (TSK == TSK_ImplicitInstantiation) {
|
||||
if (AtEndOfTU && !getDiagnostics().hasErrorOccurred()) {
|
||||
if (AtEndOfTU && !getDiagnostics().hasErrorOccurred() &&
|
||||
!getSourceManager().isInSystemHeader(PatternDecl->getLocStart())) {
|
||||
Diag(PointOfInstantiation, diag::warn_func_template_missing)
|
||||
<< Function;
|
||||
Diag(PatternDecl->getLocation(), diag::note_forward_template_decl);
|
||||
@ -4347,7 +4348,8 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
|
||||
std::make_pair(Var, PointOfInstantiation));
|
||||
} else if (TSK == TSK_ImplicitInstantiation) {
|
||||
// Warn about missing definition at the end of translation unit.
|
||||
if (AtEndOfTU && !getDiagnostics().hasErrorOccurred()) {
|
||||
if (AtEndOfTU && !getDiagnostics().hasErrorOccurred() &&
|
||||
!getSourceManager().isInSystemHeader(PatternDecl->getLocStart())) {
|
||||
Diag(PointOfInstantiation, diag::warn_var_template_missing)
|
||||
<< Var;
|
||||
Diag(PatternDecl->getLocation(), diag::note_forward_template_decl);
|
||||
|
@ -1,5 +1,6 @@
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 -Wundefined-func-template %s
|
||||
|
||||
#if !defined(INCLUDE)
|
||||
template <class T> struct C1 {
|
||||
static char s_var_1; // expected-note{{forward declaration of template entity is here}}
|
||||
static char s_var_2; // expected-note{{forward declaration of template entity is here}}
|
||||
@ -142,6 +143,16 @@ namespace test_24 {
|
||||
void h(X<int> x) { g(x); } // no warning for use of 'g' despite the declaration having been instantiated from a template
|
||||
}
|
||||
|
||||
#define INCLUDE
|
||||
#include "undefined-template.cpp"
|
||||
void func_25(SystemHeader<char> *x) {
|
||||
x->meth();
|
||||
}
|
||||
|
||||
int main() {
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#pragma clang system_header
|
||||
template <typename T> struct SystemHeader { T meth(); };
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user