diff options
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 12 | ||||
| -rw-r--r-- | clang/test/SemaCXX/Inputs/override-system-header.h | 3 | ||||
| -rw-r--r-- | clang/test/SemaCXX/override-in-system-header.cpp | 2 |
3 files changed, 12 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 0fae8c86d1b..c1157451966 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1905,12 +1905,14 @@ void Sema::DiagnoseAbsenceOfOverrideControl(NamedDecl *D) { isa<CXXDestructorDecl>(MD)) return; - if (MD->getLocation().isMacroID()) { - SourceLocation MacroLoc = getSourceManager().getSpellingLoc(MD->getLocation()); - if (getSourceManager().isInSystemHeader(MacroLoc)) + SourceLocation Loc = MD->getLocation(); + SourceLocation SpellingLoc = Loc; + if (getSourceManager().isMacroArgExpansion(Loc)) + SpellingLoc = getSourceManager().getImmediateExpansionRange(Loc).first; + SpellingLoc = getSourceManager().getSpellingLoc(SpellingLoc); + if (SpellingLoc.isValid() && getSourceManager().isInSystemHeader(SpellingLoc)) return; - } - + if (MD->size_overridden_methods() > 0) { Diag(MD->getLocation(), diag::warn_function_marked_not_override_overriding) << MD->getDeclName(); diff --git a/clang/test/SemaCXX/Inputs/override-system-header.h b/clang/test/SemaCXX/Inputs/override-system-header.h index 9a1bde5a26b..9831ab7952b 100644 --- a/clang/test/SemaCXX/Inputs/override-system-header.h +++ b/clang/test/SemaCXX/Inputs/override-system-header.h @@ -1,3 +1,6 @@ // override-system-header.h to test out 'override' warning. // rdar://18295240 #define END_COM_MAP virtual unsigned AddRef(void) = 0; + +#define STDMETHOD(method) virtual void method +#define IFACEMETHOD(method) STDMETHOD(method) diff --git a/clang/test/SemaCXX/override-in-system-header.cpp b/clang/test/SemaCXX/override-in-system-header.cpp index 88c53e4430a..689585e0cf1 100644 --- a/clang/test/SemaCXX/override-in-system-header.cpp +++ b/clang/test/SemaCXX/override-in-system-header.cpp @@ -8,10 +8,12 @@ struct A { virtual void x(); END_COM_MAP; + IFACEMETHOD(Initialize)(); }; struct B : A { virtual void x() override; END_COM_MAP; + IFACEMETHOD(Initialize)(); }; |

