diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-03-30 06:44:54 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-03-30 06:44:54 +0000 |
commit | ee4f4025c3e770d6b5f0cbca5b92f43d88056323 (patch) | |
tree | 6c3450eeef16d9a62f341db26023aaf47f7e7fa5 /clang/lib/Sema/SemaDeclCXX.cpp | |
parent | 0dc714a00f222c2d1ccf5822ec6ba99a82fc56e8 (diff) | |
download | bcm5719-llvm-ee4f4025c3e770d6b5f0cbca5b92f43d88056323.tar.gz bcm5719-llvm-ee4f4025c3e770d6b5f0cbca5b92f43d88056323.zip |
Sema: Implement DR317
Summary:
Declaring a function as inline after it has been defined is in violation
of [dcl.fct.spec]p4. The program would get a strong definition instead
of getting a function with linkonce_odr linkage.
Reviewers: rsmith
CC: cfe-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D3220
llvm-svn: 205129
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 36a1541a232..dac2490c643 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -584,6 +584,7 @@ bool Sema::MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, } } + const FunctionDecl *Def; // C++11 [dcl.constexpr]p1: If any declaration of a function or function // template has a constexpr specifier then all its declarations shall // contain the constexpr specifier. @@ -592,6 +593,13 @@ bool Sema::MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, << New << New->isConstexpr(); Diag(Old->getLocation(), diag::note_previous_declaration); Invalid = true; + } else if (!Old->isInlined() && New->isInlined() && Old->isDefined(Def)) { + // C++11 [dcl.fcn.spec]p4: + // If the definition of a function appears in a translation unit before its + // first declaration as inline, the program is ill-formed. + Diag(New->getLocation(), diag::err_inline_decl_follows_def) << New; + Diag(Def->getLocation(), diag::note_previous_definition); + Invalid = true; } // C++11 [dcl.fct.default]p4: If a friend declaration specifies a default |