Comments
Patch
@@ -146,9 +146,12 @@ lvalue_kind (const_tree ref)
return clk_ordinary;
break;
- /* A currently unresolved scope ref. */
+ /* A scope ref in a template, left as SCOPE_REF to support later
+ access checking. */
case SCOPE_REF:
- gcc_unreachable ();
+ gcc_assert (!type_dependent_expression_p (CONST_CAST_TREE(ref)));
+ return lvalue_kind (TREE_OPERAND (ref, 1));
+
case MAX_EXPR:
case MIN_EXPR:
/* Disallow <? and >? as lvalues if either argument side-effects. */
new file mode 100644
@@ -0,0 +1,15 @@
+// PR c++/46058
+
+class StringLiterals {
+public:
+ static const char dec[];
+};
+
+template<class St, class Base, const char* name>
+class NoValueCommand : public Base {
+public:
+};
+
+template<class St, class Base>
+class DecBasic : public NoValueCommand<St,Base,StringLiterals::dec> {
+};
In templates we keep SCOPE_REFs around even when they aren't dependent so that we can give access control errors at instantiation time. But that means we need to be able to deal with them. Tested x86_64-pc-linux-gnu, applied to trunk. commit dc6397243e8affb028a658b5491c1b5b9d755d0a Author: Jason Merrill <jason@redhat.com> Date: Wed Nov 24 18:20:49 2010 -0500 PR c++/46058 * tree.c (lvalue_kind) [SCOPE_REF]: Handle non-dependent case.