tree return_type;
return_type = TREE_TYPE (TREE_TYPE (fn));
expr = build (CALL_EXPR, return_type, fn, args, NULL_TREE);
+ if (TREE_THIS_VOLATILE (fn) && cfun)
+ current_function_returns_abnormally = 1;
if (!VOID_TYPE_P (return_type))
require_complete_type (return_type);
return convert_from_reference (expr);
extern tree build_nop (tree, tree);
extern tree non_reference (tree);
extern tree lookup_anon_field (tree, tree);
+extern bool invalid_nonstatic_memfn_p (tree);
/* in typeck2.c */
extern void require_complete_eh_spec_types (tree, tree);
return error_mark_node;
if (!TREE_TYPE (expr))
return expr;
+ if (invalid_nonstatic_memfn_p (expr))
+ return error_mark_node;
if (VOID_TYPE_P (TREE_TYPE (expr)))
return expr;
switch (TREE_CODE (expr))
if (k->name == FRIEND_NAME (list))
for (friends = FRIEND_DECLS (list); friends;
friends = TREE_CHAIN (friends))
- /* Only interested in global functions with potentially hidden
- (i.e. unqualified) declarations. */
- if (CP_DECL_CONTEXT (TREE_VALUE (friends)) == context)
- if (add_function (k, TREE_VALUE (friends)))
+ {
+ tree fn = TREE_VALUE (friends);
+
+ /* Only interested in global functions with potentially hidden
+ (i.e. unqualified) declarations. */
+ if (CP_DECL_CONTEXT (fn) != context)
+ continue;
+ /* Template specializations are never found by name lookup.
+ (Templates themselves can be found, but not template
+ specializations.) */
+ if (TREE_CODE (fn) == FUNCTION_DECL && DECL_USE_TEMPLATE (fn))
+ continue;
+ if (add_function (k, fn))
return true;
+ }
/* Process template arguments. */
if (CLASSTYPE_TEMPLATE_INFO (type)
else if (IDENTIFIER_OPNAME_P (DECL_NAME (r)))
grok_op_properties (r, DECL_FRIEND_P (r),
(complain & tf_error) != 0);
+
+ if (DECL_FRIEND_P (t) && DECL_FRIEND_CONTEXT (t))
+ SET_DECL_FRIEND_CONTEXT (r,
+ tsubst (DECL_FRIEND_CONTEXT (t),
+ args, complain, in_decl));
}
break;
case COMPONENT_REF:
op1_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 0),
treat_class_rvalues_as_lvalues);
+ /* In an expression of the form "X.Y", the packed-ness of the
+ expression does not depend on "X". */
+ op1_lvalue_kind &= ~clk_packed;
+ /* Look at the member designator. */
if (!op1_lvalue_kind
/* The "field" can be a FUNCTION_DECL or an OVERLOAD in some
situations. */
}
\f
+/* EXPR is being used in a context that is not a function call.
+ Enforce:
+
+ [expr.ref]
+
+ The expression can be used only as the left-hand operand of a
+ member function call.
+
+ [expr.mptr.operator]
+
+ If the result of .* or ->* is a function, then that result can be
+ used only as the operand for the function call operator ().
+
+ by issuing an error message if appropriate. Returns true iff EXPR
+ violates these rules. */
+
+bool
+invalid_nonstatic_memfn_p (tree expr)
+{
+ if (TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE)
+ {
+ error ("invalid use of non-static member function");
+ return true;
+ }
+ return false;
+}
+
/* Perform the conversions in [expr] that apply when an lvalue appears
in an rvalue context: the lvalue-to-rvalue, array-to-pointer, and
function-to-pointer conversions.
error ("void value not ignored as it ought to be");
return error_mark_node;
}
- if (code == METHOD_TYPE)
- {
- error ("invalid use of non-static member function");
- return error_mark_node;
- }
+ if (invalid_nonstatic_memfn_p (exp))
+ return error_mark_node;
if (code == FUNCTION_TYPE || is_overloaded_fn (exp))
return build_unary_op (ADDR_EXPR, exp, 0);
if (code == ARRAY_TYPE)
--- /dev/null
+// PR c++/15696
+
+struct A {};
+
+typedef void (A::*ftype)();
+
+void foo() { A().*ftype(); } // { dg-error "" }
void Foo (Packed &p)
{
Ref (p.i); // { dg-error "cannot bind packed field" "" }
- Ref (p.u.i); // { dg-error "cannot bind packed field" "" }
+ Ref (p.u.i);
Ref (p.u); // { dg-error "cannot bind packed field" "" }
}
if ((r = ConstRef (p.i, &p.i, i)))
return r + 6;
- if ((r = ConstRef (p.u.i, &p.u.i, ui)))
- return r + 8;
- if ((r = ConstRef (p.u, &p.u, ui)))
- return r + 10;
return 0;
}
--- /dev/null
+// PR c++/15209
+// { dg-options "-w" }
+
+typedef unsigned int size_t;
+typedef unsigned char uint8_t;
+typedef unsigned short int uint16_t;
+
+typedef unsigned int uint32_t;
+__extension__ typedef unsigned long long int uint64_t;
+
+typedef uint8_t u8;
+typedef uint16_t u16;
+typedef uint32_t u32;
+typedef uint64_t u64;
+
+struct MAGIC {u8 magic[8];} __attribute__ ((packed));
+struct PACKETTYPE {u8 type[16];} __attribute__ ((packed));
+
+
+typedef u16 leu16;
+typedef u32 leu32;
+typedef u64 leu64;
+
+class MD5Hash
+{
+public:
+
+ MD5Hash(void) {};
+
+ void *print(void) const;
+ MD5Hash(const MD5Hash &other);
+ MD5Hash& operator=(const MD5Hash &other);
+
+public:
+ u8 hash[16];
+};
+
+struct PACKET_HEADER
+{
+
+ MAGIC magic;
+ leu64 length;
+ MD5Hash hash;
+ MD5Hash setid;
+ PACKETTYPE type;
+} __attribute__ ((packed));
+
+
+struct MAINPACKET
+{
+ PACKET_HEADER header;
+
+ leu64 blocksize;
+ leu32 recoverablefilecount;
+ MD5Hash fileid[0];
+
+
+} __attribute__ ((packed));
+
+struct CriticalPacket
+{
+ u8 *packetdata;
+ size_t packetlength;
+};
+
+class MainPacket : public CriticalPacket
+{
+ const MD5Hash& SetId(void) const;
+
+ u64 blocksize;
+ u32 totalfilecount;
+ u32 recoverablefilecount;
+};
+
+inline const MD5Hash& MainPacket::SetId(void) const
+{
+ return ((const MAINPACKET*)packetdata)->header.setid;
+}
// Contribued by Gabriel Dos Reis <gdr@codesourcery.com>
// Origin: iskey@i100.ryd.student.liu.se
-// { dg-do link }
-#include <iostream>
-using namespace std;
+class ostream;
+extern ostream& cout;
template <class T> struct s;
int main()
{
s<int>::t y;
- cout << y;
+ cout << y; // { dg-error "" }
}
--- /dev/null
+// PR c++/15265
+
+enum Relation {equalOp};
+template<typename B>
+class A {
+public:
+ static
+ bool Relop(const A&, const A&, Relation);
+
+ friend
+ bool operator==(const A& a1, const A& a2) {
+ return Relop(a1, a2, equalOp);
+ }
+ B* b;
+};
+
+int main() {
+ A<int> a; a == a;
+ return 0;
+}
+
+
--- /dev/null
+// PR c++/15629
+// { dg-do link }
+
+template<int a, int b> class T;
+
+template<int a, int b> void func(T<a, b> * t);
+template<int a> void func(T<a, 3> * t) {}
+template void func<2>(T<2, 3>*);
+
+template<int a, int b> struct T {
+ friend void func<a, b>(T<a, b> * t);
+ friend void func<a> (T<a, 3> * t);
+
+ void foo();
+};
+
+template<int a, int b> void T<a, b>::foo() {
+ func((T<2,3>*)0);
+}
+
+int main() {
+ T<2,3>().foo();
+}
--- /dev/null
+// { dg-options "-Wreturn-type" }
+// PR c++/15742
+
+extern void exit(int) __attribute__ ((noreturn));
+
+template<typename T>
+struct A {
+ int find_cmp(void) { exit(1); }
+};