From: Alp Toker Date: Sun, 1 Jun 2014 18:49:32 +0000 (+0000) Subject: Fix the undefined-but-used odr-use marker (DR48) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6c42213ebecc50d5d7390c847bb4c2c23fa978bb;p=clang Fix the undefined-but-used odr-use marker (DR48) We should treat tentative definitions as undefined for the purpose of ODR-use linkage checking. This broke somewhere around r149731 when tests were disabled. Note that test coverage for these diagnostics is generally lacking due to a separate issue (PR19910: Don't suppress unused/undefined warnings when there are errors). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209996 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Sema/SemaInternal.h b/include/clang/Sema/SemaInternal.h index 4ee10478e4..59c84517a7 100644 --- a/include/clang/Sema/SemaInternal.h +++ b/include/clang/Sema/SemaInternal.h @@ -58,10 +58,8 @@ inline void MarkVarDeclODRUsed(VarDecl *Var, SourceLocation Loc, Sema &SemaRef, const unsigned *const FunctionScopeIndexToStopAt) { // Keep track of used but undefined variables. - // FIXME: We shouldn't suppress this warning for static data members. - if (Var->hasDefinition(SemaRef.Context) == VarDecl::DeclarationOnly && - !Var->isExternallyVisible() && - !(Var->isStaticDataMember() && Var->hasInit())) { + if (Var->hasDefinition(SemaRef.Context) != VarDecl::Definition && + !Var->isExternallyVisible()) { SourceLocation &old = SemaRef.UndefinedButUsed[Var->getCanonicalDecl()]; if (old.isInvalid()) old = Loc; } diff --git a/test/CXX/drs/dr0xx.cpp b/test/CXX/drs/dr0xx.cpp index 29e1720b1b..64b85a81d9 100644 --- a/test/CXX/drs/dr0xx.cpp +++ b/test/CXX/drs/dr0xx.cpp @@ -507,14 +507,13 @@ namespace dr48 { // dr48: yes namespace { struct S { static const int m = 0; - static const int n = 0; + // FIXME: This diagnostic is working but gets suppressed due to other errors in the TU. + static const int n = 0; // FIXME-expected-warning {{has internal linkage but is not defined}} static const int o = 0; }; } int a = S::m; - // FIXME: We should produce a 'has internal linkage but is not defined' - // diagnostic for 'S::n'. - const int &b = S::n; + const int &b = S::n; // FIXME-expected-note {{used here}} const int S::o; const int &c = S::o; } diff --git a/test/SemaCXX/undefined-internal.cpp b/test/SemaCXX/undefined-internal.cpp index 1cb0708a53..7f81ac9feb 100644 --- a/test/SemaCXX/undefined-internal.cpp +++ b/test/SemaCXX/undefined-internal.cpp @@ -137,15 +137,12 @@ namespace cxx11_odr_rules { // // Note that the warning in question can trigger in cases some people would // consider false positives; hopefully that happens rarely in practice. - // - // FIXME: Suppressing this test while I figure out how to fix a bug in the - // odr-use marking code. namespace { struct A { static const int unused = 10; - static const int used1 = 20; // xpected-warning {{internal linkage}} - static const int used2 = 20; // xpected-warning {{internal linkage}} + static const int used1 = 20; // expected-warning {{internal linkage}} + static const int used2 = 20; // expected-warning {{internal linkage}} virtual ~A() {} }; } @@ -166,10 +163,10 @@ namespace cxx11_odr_rules { // Check that the checks work with unevaluated contexts (void)sizeof(p(A::used1)); - (void)typeid(p(A::used1)); // xpected-note {{used here}} + (void)typeid(p(A::used1)); // expected-note {{used here}} // Misc other testing - a(A::unused, 1 ? A::used2 : A::used2); // xpected-note {{used here}} + a(A::unused, 1 ? A::used2 : A::used2); // expected-note {{used here}} b(); } }