summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp12
-rw-r--r--clang/test/SemaCXX/Inputs/override-system-header.h3
-rw-r--r--clang/test/SemaCXX/override-in-system-header.cpp2
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)();
};
OpenPOWER on IntegriCloud