diff options
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 7 | ||||
| -rw-r--r-- | clang/test/SemaCXX/new-delete.cpp | 2 |
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() |

