Author: vvassilev Date: Wed Oct 19 06:19:30 2016 New Revision: 284577 URL: http://llvm.org/viewvc/llvm-project?rev=284577&view=rev Log: [modules] Do not report missing definitions of demoted constexpr variable templates.
This is a followup to regression introduced in r284284. This should fix our libstdc++ modules builds. https://reviews.llvm.org/D25678 Reviewed by Richard Smith! Added: cfe/trunk/test/Modules/Inputs/merge-var-template-def/a.h cfe/trunk/test/Modules/Inputs/merge-var-template-def/b1.h cfe/trunk/test/Modules/Inputs/merge-var-template-def/b2.h cfe/trunk/test/Modules/Inputs/merge-var-template-def/module.modulemap cfe/trunk/test/Modules/merge-var-template-def.cpp Modified: cfe/trunk/lib/Sema/SemaDecl.cpp Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=284577&r1=284576&r2=284577&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Oct 19 06:19:30 2016 @@ -10124,7 +10124,11 @@ void Sema::ActOnUninitializedDecl(Decl * // C++11 [dcl.constexpr]p1: The constexpr specifier shall be applied only to // the definition of a variable [...] or the declaration of a static data // member. - if (Var->isConstexpr() && !Var->isThisDeclarationADefinition()) { + if (Var->isConstexpr() && !Var->isThisDeclarationADefinition() && + !Var->isThisDeclarationADemotedDefinition()) { + assert((!Var->isThisDeclarationADemotedDefinition() || + getLangOpts().Modules) && + "Demoting decls is only in the contest of modules!"); if (Var->isStaticDataMember()) { // C++1z removes the relevant rule; the in-class declaration is always // a definition there. Added: cfe/trunk/test/Modules/Inputs/merge-var-template-def/a.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/merge-var-template-def/a.h?rev=284577&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/merge-var-template-def/a.h (added) +++ cfe/trunk/test/Modules/Inputs/merge-var-template-def/a.h Wed Oct 19 06:19:30 2016 @@ -0,0 +1,8 @@ +#ifndef A_H +#define A_H +template<typename T, T v> +struct S { static constexpr T value = v; }; +template<typename T, T v> +constexpr T S<T, v>::value; + +#endif Added: cfe/trunk/test/Modules/Inputs/merge-var-template-def/b1.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/merge-var-template-def/b1.h?rev=284577&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/merge-var-template-def/b1.h (added) +++ cfe/trunk/test/Modules/Inputs/merge-var-template-def/b1.h Wed Oct 19 06:19:30 2016 @@ -0,0 +1,9 @@ +#ifndef B1_H +#define B1_H +template<typename T, T v> +struct S { static constexpr T value = v; }; +template<typename T, T v> +constexpr T S<T, v>::value; + +#include "a.h" +#endif Added: cfe/trunk/test/Modules/Inputs/merge-var-template-def/b2.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/merge-var-template-def/b2.h?rev=284577&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/merge-var-template-def/b2.h (added) +++ cfe/trunk/test/Modules/Inputs/merge-var-template-def/b2.h Wed Oct 19 06:19:30 2016 @@ -0,0 +1,9 @@ +#ifndef B2_H +#define B2_H + +template<typename T, T v> +struct S { static constexpr T value = v; }; +template<typename T, T v> +constexpr T S<T, v>::value; + +#endif Added: cfe/trunk/test/Modules/Inputs/merge-var-template-def/module.modulemap URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/merge-var-template-def/module.modulemap?rev=284577&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/merge-var-template-def/module.modulemap (added) +++ cfe/trunk/test/Modules/Inputs/merge-var-template-def/module.modulemap Wed Oct 19 06:19:30 2016 @@ -0,0 +1,5 @@ +module a { header "a.h" export * } +module b { + module b1 { header "b1.h" export * } + module b2 { header "b2.h" export * } +} Added: cfe/trunk/test/Modules/merge-var-template-def.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/merge-var-template-def.cpp?rev=284577&view=auto ============================================================================== --- cfe/trunk/test/Modules/merge-var-template-def.cpp (added) +++ cfe/trunk/test/Modules/merge-var-template-def.cpp Wed Oct 19 06:19:30 2016 @@ -0,0 +1,7 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -I%S/Inputs/merge-var-template-def -std=c++11 -verify %s +// RUN: %clang_cc1 -I%S/Inputs/merge-var-template-def -std=c++11 -verify -fmodules -Werror=undefined-internal -fmodules-local-submodule-visibility -fmodules-cache-path=%t -fimplicit-module-maps %s +// expected-no-diagnostics + +#include "b2.h" +const bool *y = &S<bool, false>::value; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits