[LLVMbugs] [Bug 19643] New: accessing an element of `constexpr static array` inaccurately treated as ODR-usage

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Fri May 2 12:50:33 PDT 2014


http://llvm.org/bugs/show_bug.cgi?id=19643

            Bug ID: 19643
           Summary: accessing an element of `constexpr static array`
                    inaccurately treated as ODR-usage
           Product: clang
           Version: 3.4
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++11
          Assignee: unassignedclangbugs at nondot.org
          Reporter: filip.roseen at gmail.com
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified

Created attachment 12469
  --> http://llvm.org/bugs/attachment.cgi?id=12469&action=edit
testcase.cpp

struct A {
  static constexpr int a[] = {1,2,3};
};

int main () {
  int value = A::a[0];
}

---------------------------------------------------------

In the above snippet `clang` inaccurately mandates a definition of `A::a`, even
though there is nothing in the snippet that would ODR-use said static data
member.

The matter has been discussed quite thouroghly in both ##c++ (freenode) and
`Lounge<C++>` (stackoverflow) after I brought attention to the matter.

`gcc` happily compiles the snippet, whereas `clang`, inaccuretely, spits out a
diagnostic about "undefined reference".

----------------------------------------------------------

[ Note: standard quotations shortened for readability ]

[basic.def.odr]p2

  > An expression is potentially evaluated unless it is an unevaluated
  > operand (Clause 5) or a subexpression thereof. A variable whose
  > name appears a potentially-evaluated expression is odr-used unless
  > it is an object that satisfies the requirement for appearing in a
  > constant expression (5.19) and the lvalue-to-rvalue conversion
  > (4.1) is immediately applied.

[expr.const]p2

  > - an lvalue-to-rvalue conversion (4.1) unless it is applied to
  >
  >    - a glvalue of literal type that refers to a non-volatile
  >    object defined with `constexpr`, or that refers to a sub-object
  >    of such an type.

-----------------------------------------------------------------------

`A::a` in testcase.cpp is a literal type, which is also declared as
`constexpr`, and we are accessing a sub-object of this type; `clang` is
therefore wrong to mandate a definition.

-----------------------------------------------------------------------

More about the matter can be read here:
http://stackoverflow.com/q/23428684/1090079

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20140502/1ddfbd9c/attachment.html>


More information about the llvm-bugs mailing list