Index: include/clang/AST/Decl.h =================================================================== --- include/clang/AST/Decl.h +++ include/clang/AST/Decl.h @@ -1680,7 +1680,9 @@ protected: // Since a Deduction Guide [C++17] will never have a body, we can share the - // storage, and use a different name. + // storage, and use a different name. Since WillHaveBody is not serialized we + // don't need to worry about collisions there. + union { /// Indicates if the function declaration will have a body, once we're done /// parsing it. @@ -2074,8 +2076,8 @@ void setHasSkippedBody(bool Skipped = true) { HasSkippedBody = Skipped; } /// True if this function will eventually have a body, once it's fully parsed. - bool willHaveBody() const { return WillHaveBody; } - void setWillHaveBody(bool V = true) { WillHaveBody = V; } + bool willHaveBody() const; + void setWillHaveBody(bool V = true); void setPreviousDeclaration(FunctionDecl * PrevDecl); Index: include/clang/AST/InlineDeclMembers.h =================================================================== --- include/clang/AST/InlineDeclMembers.h +++ include/clang/AST/InlineDeclMembers.h @@ -0,0 +1,37 @@ +//===- InlineDeclMembers.h - Decl.h Members that must be inlined -*- C++ -*-==// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the Decl subclasses. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_AST_INLINEDECLMEMBERS_H +#define LLVM_CLANG_AST_INLINEDECLMEMBERS_H + +#include "clang/AST/Decl.h" +#include "clang/AST/DeclCXX.h" + + +inline bool clang::FunctionDecl::willHaveBody() const { + assert(!isa(this) && + "must not be called on a deduction guide since we share this data " + "member while giving it different semantics"); + return WillHaveBody; +} +inline void clang::FunctionDecl::setWillHaveBody(bool V) { + assert(!isa(this) && + "must not be called on a deduction guide since we share this data " + "member while giving it different semantics"); + WillHaveBody = V; +} + + +#endif //LLVM_CLANG_AST_INLINEDECLMEMBERS_H + + Index: include/clang/Sema/Sema.h =================================================================== --- include/clang/Sema/Sema.h +++ include/clang/Sema/Sema.h @@ -22,6 +22,7 @@ #include "clang/AST/Expr.h" #include "clang/AST/ExprObjC.h" #include "clang/AST/ExternalASTSource.h" +#include "clang/AST/InlineDeclMembers.h" #include "clang/AST/LocInfoType.h" #include "clang/AST/MangleNumberingContext.h" #include "clang/AST/NSAPI.h" Index: lib/AST/Decl.cpp =================================================================== --- lib/AST/Decl.cpp +++ lib/AST/Decl.cpp @@ -23,6 +23,7 @@ #include "clang/AST/DeclTemplate.h" #include "clang/AST/Expr.h" #include "clang/AST/ExprCXX.h" +#include "clang/AST/InlineDeclMembers.h" #include "clang/AST/PrettyPrinter.h" #include "clang/AST/Stmt.h" #include "clang/AST/TypeLoc.h" Index: lib/AST/DeclCXX.cpp =================================================================== --- lib/AST/DeclCXX.cpp +++ lib/AST/DeclCXX.cpp @@ -18,6 +18,7 @@ #include "clang/AST/DeclTemplate.h" #include "clang/AST/Expr.h" #include "clang/AST/ExprCXX.h" +#include "clang/AST/InlineDeclMembers.h" #include "clang/AST/ODRHash.h" #include "clang/AST/TypeLoc.h" #include "clang/Basic/IdentifierTable.h" Index: lib/Parse/ParseCXXInlineMethods.cpp =================================================================== --- lib/Parse/ParseCXXInlineMethods.cpp +++ lib/Parse/ParseCXXInlineMethods.cpp @@ -13,6 +13,7 @@ #include "clang/Parse/Parser.h" #include "clang/AST/DeclTemplate.h" +#include "clang/AST/InlineDeclMembers.h" #include "clang/Parse/ParseDiagnostic.h" #include "clang/Parse/RAIIObjectsForParser.h" #include "clang/Sema/DeclSpec.h"