summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/lib/Sema/SemaDecl.cpp7
-rw-r--r--clang/test/SemaCXX/new-delete.cpp2
3 files changed, 11 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index d8fef68d48c..55c4e9d57b5 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -5900,6 +5900,8 @@ def err_operator_new_delete_declared_in_namespace : Error<
"%0 cannot be declared inside a namespace">;
def err_operator_new_delete_declared_static : Error<
"%0 cannot be declared static in global scope">;
+def err_operator_new_delete_declared_inline : Error<
+ "%0 cannot be declared 'inline'">;
def err_operator_new_delete_invalid_result_type : Error<
"%0 must return type %1">;
def err_operator_new_delete_dependent_result_type : Error<
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index d7c4f7834f9..176fe8a1cf2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -6804,6 +6804,13 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
NewFD->setType(Context.getFunctionType(FPT->getResultType(),
FPT->getArgTypes(), EPI));
}
+
+ // C++11 [replacement.functions]p3:
+ // The program's definitions shall not be specified as inline.
+ if (isInline && NewFD->isReplaceableGlobalAllocationFunction())
+ Diag(D.getDeclSpec().getInlineSpecLoc(),
+ diag::err_operator_new_delete_declared_inline)
+ << NewFD->getDeclName();
}
// Filter out previous declarations that don't match the scope.
diff --git a/clang/test/SemaCXX/new-delete.cpp b/clang/test/SemaCXX/new-delete.cpp
index 898c6e0879a..de26cad62e1 100644
--- a/clang/test/SemaCXX/new-delete.cpp
+++ b/clang/test/SemaCXX/new-delete.cpp
@@ -24,6 +24,8 @@ void* operator new(size_t, int*); // expected-note 3 {{candidate}}
void* operator new(size_t, float*); // expected-note 3 {{candidate}}
void* operator new(size_t, S); // expected-note 2 {{candidate}}
+inline void operator delete(void *); // expected-error {{'operator delete' cannot be declared 'inline'}}
+
struct foo { };
void good_news()
OpenPOWER on IntegriCloud